> 백엔드 개발 > C++ > 본문

`벡터::push_back`이 예상보다 복사 생성자를 더 많이 호출하는 것처럼 보이는 이유는 무엇입니까?

Linda Hamilton
풀어 주다: 2024-10-31 22:56:28
원래의
470명이 탐색했습니다.

Why Does `vector::push_back` Seem to Call the Copy Constructor More Than Expected?

벡터의 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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

원천:php.cn
본 웹사이트의 성명
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.
저자별 최신 기사
인기 튜토리얼
더>
최신 다운로드
더>
웹 효과
웹사이트 소스 코드
웹사이트 자료
프론트엔드 템플릿
회사 소개 부인 성명 Sitemap
PHP 중국어 웹사이트:공공복지 온라인 PHP 교육,PHP 학습자의 빠른 성장을 도와주세요!