2011-09-23 3 views
3

저는 C++의 연습을하고 있지만 예기치 않은 결과를 얻고 있습니다. 누군가가 설명하기를 바랍니다. 이 연습에서는 기본 생성자, 복사 생성자 및 소멸자가 모두 포함 된 rock이라는 클래스를 작성해야한다고 요청했습니다.C++에서의 벡터 내부 작업?

vector<Rock> byValue; 
Rock r1, r2, r3; 
byValue.push_back(r1); 
byValue.push_back(r2); 
byValue.push_back(r3); 
cout << "byValue populated\n\n"; 

내가 기대했던 (그리고 운동 솔루션 참조) 출력은 다음과 같습니다 :

Rock() 
Rock() 
Rock() 
Rock(const Rock&) 
Rock(const Rock&) 
Rock(const Rock&) 
byValue populated 

~Rock() 
~Rock() 
~Rock() 
~Rock() 
~Rock() 
~Rock() 
나는 시도하고 값 벡터에이 클래스의 구성원을 추가 오전 주요 방법에서

내가 얻을 출력은 그러나 : 공동 여분 통화있을 것 같습니다 이유

Rock() 
Rock() 
Rock() 
Rock(const Rock&) 
Rock(const Rock&) 
Rock(const Rock&) 
~Rock() 
Rock(const Rock&) 
Rock(const Rock&) 
Rock(const Rock&) 
~Rock() 
~Rock() 
byValue populated 

~Rock() 
~Rock() 
~Rock() 
~Rock() 
~Rock() 
~Rock() 

는 사람이 설명 할 수 py 생성자 및 소멸자?

답변

8

벡터 크기가 조정되면 요소를 새 위치로 이동해야합니다.

이것은 정상입니다.

당신이 push_back를 호출하기 전에

byValue.reserve(10); 

를 호출 할 경우, 여분의 복사본이 사라집니다.

4

벡터는 요소를 연속적으로 저장합니다. 요소가 삽입 될 때마다 항상 메모리를 다시 할당하지 않으려면 메모리를 많이 할당해야합니다. 그래서 벡터는 "크기"에 관한 두 가지 방법, 즉 저장된 요소의 수를 알려주는 size()과 할당 된 메모리 양을 나타내는 capacity()을 가지고 있습니다.

일반적으로 (그러나 STL 구현에 따라 다름) 대용량 (선행 용량)이 두 배로 증가합니다. 더 많은 메모리를 할당하고 데이터를 연속적으로 저장해야하므로 (list과 비교하여) 내부 데이터를 이동해야합니다. STL은 데이터를 복사하기 때문에 생성자/소멸자에 대한 호출이 너무 많습니다.

벡터에 저장할 요소의 수를 알고있는 경우 reserve을 사용하여 처음 할당해야하는 메모리 양을 나타낼 수 있습니다.

1

std::vector에는 요소를 저장할 메모리가 제한되어 있습니다. capacity으로 얼마나 많은 쿼리를 할 수 있습니다. reserve 메서드를 사용하여 벡터에 여분의 메모리를 확보하도록 지시 할 수도 있습니다.

요소를 벡터에 푸시하고 그 용량이 0이면 (여분의 메모리를 다 사용했습니다) 새로운 큰 배열을 할당하고 원본 요소를 복사합니다. 그것이 여분의 모든 사본이 나오는 곳입니다.

출력을 보면 벡터가 두 배 커야하는 것처럼 보입니다. 코드를 변경하기 전에 예비를 호출하도록 코드를 변경하면 벡터가 커질 필요가없고 추가 복사본이 없습니다. ideone.com

: 여기

이 모두가 함께 오는 방법을 보여줍니다 자세한 코드입니다