벡터의 push_back: 숨겨진 복사본 생성자 호출 발견
혼란스러운 시나리오에서 벡터의 push_back 메서드는 복사 생성자를 호출하는 것처럼 보입니다. 예상보다 더 많은 시간. 이 동작을 조사하면서 세부 사항을 살펴보겠습니다.
제공된 코드 조각을 고려하세요.
<code class="cpp">class Myint { //... }; vector<Myint> myints; Myint x; myints.push_back(x); x.set(1); myints.push_back(x);</code>
처음에는 x가 벡터에 푸시됩니다. 예상대로 초기화 중에 하나의 복사본이 발생합니다. 그러나 출력을 검토해 보면 복사 생성자가 예상했던 두 번이 아닌 세 번 호출된 것을 발견했습니다. 이러한 불일치의 원인은 무엇입니까?
벡터의 내부 동작이 작용합니다. 벡터의 공간이 부족해지면 메모리를 재할당해야 합니다. 우리의 경우 두 번째 push_back이 재할당을 트리거합니다. Myint에 대해 암시적으로 정의된 이동 생성자가 없으므로 복사 생성자가 활용됩니다. 결과적으로 첫 번째 요소가 새로 할당된 메모리에 복사되고 x의 두 번째 복사본이 복사됩니다. 이 추가 복사본은 x의 my_int가 1로 설정된 복사 생성자의 세 번째 호출을 설명합니다.
따라서 총 3번의 복사 생성자 호출이 발생합니다. 이 숫자는 구현 및 초기 벡터 용량에 따라 달라질 수 있지만 최소 두 번의 호출은 필요합니다.
이를 완화하려면 예약 방법을 사용하여 미리 더 많은 메모리를 예약하는 것이 좋습니다. 이렇게 하면 불필요한 재할당을 피하고 충분한 용량이 보장됩니다.
<code class="cpp">myints.reserve(2); // Allows two insertions without reallocation</code>
또한 emplace_back 메서드를 사용하여 복사본을 제거할 수 있습니다.
<code class="cpp">myints.emplace_back(0); // Creates a new element directly in the vector</code>
Emplace_back은 복사본을 우회하고 생성자에 전달되는 임의 인수를 취합니다. 또는 움직입니다.
위 내용은 `벡터::push_back`이 예상보다 복사 생성자를 더 많이 호출하는 것처럼 보이는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!