Rumah  >  Artikel  >  pembangunan bahagian belakang  >  Mengapakah `push_back` Mendapat Pembina Salin Berbilang Kali dalam Vektor?

Mengapakah `push_back` Mendapat Pembina Salin Berbilang Kali dalam Vektor?

DDD
DDDasal
2024-11-03 15:39:30967semak imbas

Why Does `push_back` Invoke the Copy Constructor Multiple Times in a Vector?

Berbilang Seruan Pembina Salin dalam Tekan Belakang Vektor

Dalam coretan yang diberikan, kaedah tolak_balik myints objek vektor memanggil salinan pembina lebih daripada dua kali, bercanggah dengan jangkaan awal. Ini menimbulkan persoalan tentang tingkah laku dalaman vektor.

Penjelasan:

Tekan Belakang Pertama:

  • A elemen baru dimasukkan ke dalam vektor menggunakan x. Ini mencetuskan satu operasi salinan: Permulaan elemen baharu menggunakan hujah. Oleh kerana pembina lalai x memulakan my_int kepada sifar, pembina salin melaporkan sifar.

Tekan Balik Kedua dan Alokasi Semula:

  • Elemen kedua ialah push_back'd. Walau bagaimanapun, kapasiti vektor melebihi, memerlukan pengagihan semula. Memandangkan Myint tidak mempunyai pembina langkah tersirat, pembina salinan digunakan sebaliknya.
  • Elemen pertama disalin ke dalam ingatan baharu, mengekalkan nilai sifarnya. Selepas itu, x disalin untuk memulakan elemen kedua dengan my_int ditetapkan kepada satu, seperti yang ditunjukkan dalam output pembina salinan.
  • Ini menghasilkan tiga jumlah seruan pembina salinan.

Bilangan Invokasi:

  • Bilangan panggilan pembina salinan boleh berbeza-beza dengan pelaksanaan yang berbeza disebabkan kapasiti vektor awal. Walau bagaimanapun, dua panggilan adalah minimum.
  • Peruntukan semula boleh dielakkan, justeru mengurangkan operasi penyalinan, dengan meningkatkan kapasiti vektor terlebih dahulu menggunakan rizab(2).

Mengurangkan Operasi Salin:

  • Sebagai alternatif, kaedah emplace_back boleh digunakan untuk memasukkan elemen. Ia tidak memerlukan salinan atau pergerakan, memajukan terus hujah kepada pembina elemen.

Ringkasnya, kaedah push_back boleh menghasilkan seruan pembina salinan berbilang disebabkan penstrukturan semula vektor dalaman. Untuk mengelakkan ini, reserve() boleh digunakan untuk meningkatkan kapasiti atau emplace_back boleh digunakan untuk pemasukan elemen yang cekap tanpa salinan.

Atas ialah kandungan terperinci Mengapakah `push_back` Mendapat Pembina Salin Berbilang Kali dalam 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