Rumah >pembangunan bahagian belakang >C++ >Mengapakah pembina salinan objek `Myint` dipanggil beberapa kali apabila menggunakan `push_back()` pada `vektor`?

Mengapakah pembina salinan objek `Myint` dipanggil beberapa kali apabila menggunakan `push_back()` pada `vektor`?

Susan Sarandon
Susan Sarandonasal
2024-10-31 10:58:02492semak imbas

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

Berbilang Invokasi Pembina Salin semasa Operasi Tolak_belakang Vektor

Dalam C , apabila elemen ditambah pada vektor menggunakan kaedah push_back() , pembina salinan jenis elemen tersebut biasanya digunakan. Walau bagaimanapun, dalam senario tertentu, berbilang seruan pembina salinan mungkin diperhatikan.

Pertimbangkan coretan kod berikut:

<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>

Apabila kod ini dilaksanakan, output berikut dihasilkan:

Inside default
Inside copy with my_int = 0
Inside copy with my_int = 0
Inside copy with my_int = 1

Output ini menunjukkan bahawa pembina salinan dipanggil empat kali, bukan hanya dua kali seperti yang dijangkakan. Sebab bagi tingkah laku ini terletak pada kerja dalaman pengurusan memori vektor.

Apabila push_back() dipanggil pada vektor yang telah mencapai kapasiti dalamannya, vektor mesti diperuntukkan semula untuk menampung elemen baharu. Semasa pengagihan semula ini, elemen sedia ada disalin ke lokasi memori baharu. Proses ini menghasilkan seruan tambahan pembina salinan untuk setiap elemen.

Untuk mengelakkan gelagat penyalinan berbilang ini, beberapa langkah boleh diambil:

  • Menempah kapasiti yang mencukupi: Dengan memanggil kaedah rizab() pada vektor, kapasiti dalaman boleh ditingkatkan lebih awal, menghalang keperluan untuk pengagihan semula.
  • Menggunakan emplace_back(): Kaedah ini membolehkan pembinaan langsung elemen dalam vektor, menghapuskan keperluan untuk menyalin.

Dengan menggunakan teknik sedemikian, seruan yang tidak perlu daripada pembina salinan boleh diminimumkan, meningkatkan kecekapan operasi vektor.

Atas ialah kandungan terperinci Mengapakah pembina salinan objek `Myint` dipanggil beberapa kali apabila menggunakan `push_back()` pada `vektor`?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn