Copy Elision and Object Lifetime
Apabila mengembalikan pembolehubah setempat mengikut nilai, seseorang mungkin tertanya-tanya sama ada objek asal dimusnahkan atau tidak. Jawapannya terletak pada pemahaman elision salinan.
Dengan Copy Elision (NRVO)
Apabila pengoptimuman (dikenali sebagai Named Return Value Optimization atau NRVO) didayakan, pengkompil boleh mengoptimumkan pernyataan pemulangan dengan membina objek terus ke dalam storan di mana ia sebaliknya akan disalin ke. Akibatnya, objek asal tidak dibuat di tempat pertama.
Contoh dengan NRVO Enabled
Pertimbangkan kod berikut:
class Test { public: Test(int p) { cout << "Constructor called" << endl; } ~Test() { cout << "Destructor called" << endl; } }; Test function() { Test t(5); return t; } int main() { Test o = function(); return 0; }
Dengan NRVO didayakan, outputnya ialah:
Constructor called Destructor called
Hanya objek o dibina dan dimusnahkan, dan objek asal t dioptimumkan.
Tanpa Copy Elision
Apabila pengoptimuman dilumpuhkan (cth., -fno-elide-constructors), pernyataan pemulangan akan mengikut semantik salinan/pindah biasa.
Contoh dengan NRVO Disabled
Menggunakan kod dari atas dengan NRVO dilumpuhkan, outputnya ialah:
Constructor called Constructor called Destructor called Destructor called
Kali ini, kedua-dua objek t dan o dibina dan dimusnahkan, kerana pembinaan salinan/pindah tidak boleh dioptimumkan.
Kesimpulan
Sama ada mengembalikan pembolehubah tempatan mengikut nilai memusnahkan objek asal bergantung pada sama ada NRVO didayakan atau tidak. Dengan NRVO, objek asal mungkin dihapuskan, manakala tanpa NRVO, ia akan disalin/dialihkan mengikut semantik salinan/pindah standard.
Atas ialah kandungan terperinci Adakah Mengembalikan Pembolehubah Setempat mengikut Nilai Memusnahkan Objek Asal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!