2011-12-17 2 views
1

내 수업에는 LastQueryInfo lastQuery이라는 개체가 있습니다. 이 객체가 변경 될 때마다 history이라는 벡터에 추가합니다.요소를 벡터에 추가 할 때 개체의 복사본이 만들어 지는지 확인하는 방법은 무엇입니까?

처음에 내가 history.push_back(lastQuery)을했을 때 나는 어떤 일이 일어날 지 몰랐다. 벡터는 그 대상의 사본을 만들 것인가? 또는 그것에 대한 참조를 유지할 예정입니까? 그렇다면 나중에 lastQuery를 수정하면 히스토리 벡터에서 모든 객체 (참조가 있다고 가정)가 수정 될 예정입니까?

몇 가지 테스트를 마치면 history.push_back(lastQuery)이 실제로 개체의 복사본을 만든 다음 벡터에 추가한다는 것을 알았습니다. 하지만 테스트를하지 않고 어떻게 알 수 있습니까? C++이 복사를 할 때와 실제 객체를 추가 할 때를 어떻게 알 수 있습니까? 항상

답변

7

std::vector 사본을 저장 당신이 무엇을 push_back(). 따라서 전달 된 값을 수정해도 벡터에 저장된 값에는 영향을주지 않습니다. 그것은 Java 또는 C#과 같지 않습니다. Object o;은 실제로 객체에 대한 참조이고 객체는 가비지 컬렉터가 올 때까지 존재하며 마지막 참조가 없어지면 객체를 선택합니다. C++에서 Object o;은 실제 오브젝트입니다.이 오브젝트는 범위 끝에서 사라집니다. 오브젝트 당신 push_back()

그래서 std::vector 경우에만 저장 참조, 다음이 같은 것들에 전혀 쓸모가있을 것입니다 : 루프의 끝에서 사라집니다

std::vector<int> numbers; 
for(/* loop condition */) { 
    int number = GetUserInput(); 
    numbers.push_back(n); 
} 

number 때문에, numbers은 참조를 개최 것 std::vector이 참조 만 저장하여 구현 된 경우에는 존재하지 않을 것입니다. std::vector이 실제로 값을 저장하면 루프 이후에도 값에 액세스 할 수 있습니다. 다시 추진하고있는 것은 실제로 멀리 곧 갈 것이다 임시 경우 있도록

C++ (11)는 대신 벡터 저장에 개체의 내부를 이동 것, move semantics 지원 사자. C++ 11의 std::move()을 명시 적으로 사용하여 push_back() 동안 이동을 "강제 실행"할 수도 있습니다. 그러나 벡터는 다른 모든 경우에 값을 복사합니다. 벡터의 성능을 최적화하기위한 구현 세부 사항입니다.

4

push_back을 사용하면 항상 저장되는 개체의 복사본이 만들어집니다. vec.push_back(std::move(obj)); :

  • 는 벡터에 emplace 방법
  • 이동 생성 된 객체를 사용

    당신이 C++ (11)를 사용하는 경우, 다음 복사를 방지하는 방법은 두 가지가 있습니다

    C++ 11을 사용하지 않는 경우 포인터 만 사용하거나 boost::shared_ptr을 벡터 유형으로 사용할 수 있습니다.

관련 문제