Rumah  >  Artikel  >  pembangunan bahagian belakang  >  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
Susan Sarandonasal
2024-11-01 07:45:30749semak imbas

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>

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

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