Apa itu copy elision? Apa yang dimaksud dengan (dinamai) optimasi nilai kembali? Apa yang mereka maksudkan?
Dalam situasi apa mereka bisa terjadi? Apa itu batasan?
- Jika Anda dirujuk ke pertanyaan ini, Anda mungkin mencari pengantar .
- Untuk tinjauan teknis, lihat referensi standar .
- Lihat kasus umum di sini .
c++
optimization
c++-faq
return-value-optimization
copy-elision
Luchian Grigore
sumber
sumber
Jawaban:
pengantar
Untuk tinjauan teknis - lewati ke jawaban ini .
Untuk kasus-kasus umum di mana copy elision terjadi - lewati ke jawaban ini .
Copy elision adalah optimisasi yang diterapkan oleh kebanyakan kompiler untuk mencegah salinan ekstra (berpotensi mahal) dalam situasi tertentu. Itu membuat pengembalian dengan nilai atau nilai demi nilai layak dalam praktiknya (pembatasan berlaku).
Ini satu-satunya bentuk optimasi yang menghilangkan (ha!) Aturan as-if - copy elision dapat diterapkan bahkan jika menyalin / memindahkan objek memiliki efek samping .
Contoh berikut diambil dari Wikipedia :
Bergantung pada kompiler & pengaturan, output berikut semuanya valid :
Ini juga berarti lebih sedikit objek yang bisa dibuat, jadi Anda juga tidak bisa mengandalkan sejumlah destruktor yang dipanggil. Anda seharusnya tidak memiliki logika kritis di dalam copy / move-constructor atau destructor, karena Anda tidak dapat mengandalkan mereka yang dipanggil.
Jika panggilan untuk menyalin atau memindahkan konstruktor dihapus, konstruktor itu harus tetap ada dan harus dapat diakses. Ini memastikan bahwa copy elision tidak memungkinkan menyalin objek yang biasanya tidak dapat disalin, misalnya karena mereka memiliki konstruktor copy / move pribadi atau dihapus.
C ++ 17 : Pada C ++ 17, Copy Elision dijamin ketika suatu objek dikembalikan secara langsung:
sumber
Referensi standar
Untuk tampilan & pengenalan yang kurang teknis - lewati ke jawaban ini .
Untuk kasus-kasus umum di mana copy elision terjadi - lewati ke jawaban ini .
Salinan salinan didefinisikan dalam standar di:
12.8 Menyalin dan memindahkan objek kelas [class.copy]
sebagai
Contoh yang diberikan adalah:
dan menjelaskan:
sumber
Bentuk umum salinan salinan
Untuk tinjauan teknis - lewati ke jawaban ini .
Untuk tampilan & pengenalan yang kurang teknis - lewati ke jawaban ini .
(Bernama) Optimasi nilai kembali adalah bentuk umum dari salin salinan. Ini merujuk pada situasi di mana objek yang dikembalikan oleh nilai dari suatu metode memiliki salinannya dihapuskan. Contoh yang ditetapkan dalam standar menggambarkan pengoptimalan nilai kembali , karena objek tersebut dinamai.
Optimalisasi nilai pengembalian reguler terjadi ketika sementara dikembalikan:
Tempat umum lainnya tempat salinan elision terjadi adalah ketika sebuah nilai sementara diberikan :
atau saat pengecualian dilemparkan dan ditangkap berdasarkan nilai :
Batasan umum dari copy elision adalah:
Sebagian besar kompiler tingkat komersial mendukung elisi salinan & (N) RVO (tergantung pada pengaturan optimasi).
sumber
Copy elision adalah teknik optimisasi kompiler yang menghilangkan penyalinan / pemindahan objek yang tidak perlu.
Dalam keadaan berikut, kompiler diperbolehkan untuk menghilangkan operasi salin / pindah dan karenanya tidak memanggil konstruktor terkait:
Bahkan ketika copy elision terjadi dan copy-/ move-constructor tidak dipanggil, itu harus ada dan dapat diakses (seolah-olah tidak ada optimasi yang terjadi sama sekali), jika tidak, program ini salah bentuk.
Anda harus mengizinkan elisi salinan seperti itu hanya di tempat-tempat di mana itu tidak akan mempengaruhi perilaku yang dapat diamati dari perangkat lunak Anda. Salinan salinan adalah satu-satunya bentuk optimasi yang diizinkan memiliki (yaitu elide) efek samping yang dapat diamati. Contoh:
GCC menyediakan
-fno-elide-constructors
opsi untuk menonaktifkan copy elision. Jika Anda ingin menghindari kemungkinan copy elision, gunakan-fno-elide-constructors
.Sekarang hampir semua kompiler menyediakan elisi salinan saat optimasi diaktifkan (dan jika tidak ada opsi lain yang ditetapkan untuk menonaktifkannya).
Kesimpulan
Dengan setiap elisi salinan, satu konstruksi dan satu penghancuran salinan yang cocok dihilangkan, sehingga menghemat waktu CPU, dan satu objek tidak dibuat, sehingga menghemat ruang pada bingkai tumpukan.
sumber
ABC obj2(xyz123());
apakah itu NRVO atau RVO? apakah itu tidak mendapatkan variabel sementara / objek yang sama denganABC xyz = "Stack Overflow";//RVO