> 백엔드 개발 > C++ > C 벡터에서 `push_back` 작업 중에 복사 생성자가 몇 번 호출됩니까?

C 벡터에서 `push_back` 작업 중에 복사 생성자가 몇 번 호출됩니까?

Susan Sarandon
풀어 주다: 2024-11-01 07:45:30
원래의
839명이 탐색했습니다.

How Many Times Does the Copy Constructor Get Called During `push_back` Operations in a C   Vector?

벡터의 Push_back 복사 동작 이해

벡터를 사용하여 작업하는 동안 개발자는 push_back 작업 중 복사 생성자 호출 빈도에 관한 질문을 자주 접하게 됩니다. 예를 들어 이 동작을 자세히 살펴보겠습니다.

다음 C 코드를 고려하세요.

<code class="cpp">class Myint {
  int my_int;
public:
  Myint() : my_int(0) {
    cout << "Inside default" << endl;
  }
  Myint(const Myint& x) : my_int(x.my_int) {
    cout << "Inside copy with my_int = " << x.my_int << endl;
  }
};

int main() {
  vector<Myint> myints;
  Myint x;
  myints.push_back(x);
  x.set(1);
  myints.push_back(x);
}</code>
로그인 후 복사

이 코드 조각은 push_back 작업 중에 복사 생성자를 두 번 트리거할 것으로 예상됩니다. 그러나 실행 시 다음 출력이 관찰됩니다.

Inside default
Inside copy with my_int = 0
Inside copy with my_int = 0
Inside copy with my_int = 1
로그인 후 복사

복사 생성자가 세 번 호출된 것처럼 보이는 이유는 무엇입니까?

  • Push_back 삽입: 첫 번째 push_back 작업은 x를 벡터에 삽입하고 복사 생성자를 호출하여 새로 생성된 요소를 초기화합니다.
  • 벡터 재할당: 두 번째 요소가 push_back'd되면 벡터는 해당 용량에 도달합니다. 메모리를 제한하고 재할당합니다. Myint에는 암시적으로 정의된 이동 생성자가 없기 때문에 복사 생성자가 다시 사용됩니다. 이번에는 첫 번째 요소(my_int가 여전히 0임)와 x(my_int가 1로 업데이트됨)를 모두 복제합니다.

따라서 복사 생성자는 총 3번 호출됩니다. 이 동작을 최적화하려면:

  • 미리 메모리를 예약하세요. 더 높은 벡터 용량을 지정하면 재할당 가능성을 줄이고 복사를 최소화할 수 있습니다.
  • push_back 대신 배치 사용: myints.emplace_back(0)은 추가 복사본을 방지하면서 벡터 내에서 새 요소를 직접 구성합니다.

위 내용은 C 벡터에서 `push_back` 작업 중에 복사 생성자가 몇 번 호출됩니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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