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

`벡터`에서 `push_back()`을 사용할 때 `Myint` 객체의 복사 생성자가 여러 번 호출되는 이유는 무엇입니까?

Susan Sarandon
풀어 주다: 2024-10-31 10:58:02
원래의
405명이 탐색했습니다.

Why does the copy constructor of a `Myint` object get invoked multiple times when using `push_back()` on a `vector`?

벡터의 Push_back 작업 중 복사 생성자의 다중 호출

C에서 push_back() 메서드를 사용하여 요소가 벡터에 추가되는 경우 , 해당 요소 유형의 복사 생성자가 일반적으로 사용됩니다. 그러나 특정 시나리오에서는 복사 생성자의 여러 호출이 관찰될 수 있습니다.

다음 코드 조각을 고려하세요.

<code class="cpp">class Myint {
  private:
    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;
    }

    void set(const int& x) {
        my_int = x;
    }
};

vector<Myint> myints;
Myint x;

myints.push_back(x);
x.set(1);
myints.push_back(x);</code>
로그인 후 복사

이 코드가 실행되면 다음 출력이 생성됩니다.

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

이 출력은 복사 생성자가 예상한 것보다 두 번이 아니라 네 번 호출되었음을 나타냅니다. 이 동작의 원인은 벡터 메모리 관리의 내부 작동에 있습니다.

내부 용량에 도달한 벡터에 대해 push_back()이 호출되면 새 요소를 수용하기 위해 벡터를 다시 할당해야 합니다. 이 재할당 중에 기존 요소가 새 메모리 위치에 복사됩니다. 이 프로세스로 인해 각 요소에 대한 복사 생성자가 추가로 호출됩니다.

이러한 다중 복사 동작을 방지하려면 다음과 같은 몇 가지 조치를 취할 수 있습니다.

  • 충분한 용량 확보: 벡터에 대해 Reserve() 메서드를 호출하면 내부 용량을 미리 늘릴 수 있어 재할당이 필요하지 않습니다.
  • emplace_back() 사용: 이 메서드를 사용하면 다음이 가능합니다. 벡터 내의 요소를 직접 구성하므로 복사할 필요가 없습니다.

이러한 기술을 사용하면 복사 생성자의 불필요한 호출을 최소화하여 벡터 작업의 효율성을 높일 수 있습니다.

위 내용은 `벡터`에서 `push_back()`을 사용할 때 `Myint` 객체의 복사 생성자가 여러 번 호출되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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