Rumah > pembangunan bahagian belakang > C++ > Berapa Kali Pembina Salin Dipanggil Semasa Operasi `push_back` dalam Vektor C?

Berapa Kali Pembina Salin Dipanggil Semasa Operasi `push_back` dalam Vektor C?

Susan Sarandon
Lepaskan: 2024-11-01 07:45:30
asal
923 orang telah melayarinya

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

Memahami Gelagat Penyalinan Tolak_Balik Vektor

Semasa bekerja dengan vektor, pembangun sering menghadapi pertanyaan mengenai kekerapan seruan pembina salinan semasa operasi tolak_balik. Mari kita mendalami tingkah laku ini dengan contoh:

Pertimbangkan kod C berikut:

<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>
Salin selepas log masuk

Coretan ini dijangka mencetuskan pembina salinan dua kali semasa operasi push_back. Walau bagaimanapun, selepas pelaksanaan, kami melihat output berikut:

Inside default
Inside copy with my_int = 0
Inside copy with my_int = 0
Inside copy with my_int = 1
Salin selepas log masuk

Mengapakah pembina salinan kelihatan dipanggil tiga kali?

  • Sisipan tolak_belakang: Operasi push_back pertama memasukkan x ke dalam vektor, menggunakan pembina salinan untuk memulakan elemen yang baru dibuat.
  • Peruntukan semula vektor: Apabila elemen kedua ditolak_balik, vektor menemui kapasitinya menghadkan dan memperuntukkan semula ingatan. Oleh kerana Myint tidak mempunyai pembina bergerak yang ditakrifkan secara tersirat, pembina salinan digunakan sekali lagi. Kali ini, ia menduplikasi kedua-dua elemen pertama (dengan my_int masih pada sifar) dan kemudian x (dengan my_int dikemas kini kepada satu).

Oleh itu, secara keseluruhan, pembina salinan dipanggil tiga kali. Untuk mengoptimumkan tingkah laku ini:

  • Tempah memori terlebih dahulu: Dengan menentukan kapasiti vektor yang lebih tinggi, anda boleh mengurangkan kemungkinan pengagihan semula dan meminimumkan penyalinan.
  • Gunakan emplacement dan bukannya push_back: myints.emplace_back(0) terus membina elemen baharu dalam vektor, mengelakkan salinan tambahan.

Atas ialah kandungan terperinci Berapa Kali Pembina Salin Dipanggil Semasa Operasi `push_back` dalam Vektor C?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan Laman Web ini
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
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan