Rumah >pembangunan bahagian belakang >C++ >Adakah Mengembalikan Pembolehubah Setempat mengikut Nilai Memusnahkan Objek Asal?

Adakah Mengembalikan Pembolehubah Setempat mengikut Nilai Memusnahkan Objek Asal?

DDD
DDDasal
2024-11-09 13:15:02832semak imbas

Does Returning a Local Variable by Value Destroy the Original Object?

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!

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