Rumah > Artikel > pembangunan bahagian belakang > Adakah Mengembalikan Pembolehubah Tempatan dalam C 17 Memusnahkan Yang Asal?
Adakah Mengembalikan Pembolehubah Tempatan Memusnahkan Yang Asal?
Dalam C 17 dan seterusnya, sama ada mengembalikan pembolehubah tempatan mengembalikan salinan atau memusnahkan yang asal bergantung pada sama ada pengoptimuman didayakan.
Dengan Pengoptimuman (NRVO)
Dengan pengoptimuman didayakan (dikenali sebagai pengoptimuman nilai pulangan dinamakan atau NRVO), pengkompil boleh terus membina objek yang dikembalikan ke dalam storan di mana ia akan disalin/dialihkan ke. Ini bermakna pembolehubah tempatan asal tidak dimusnahkan.
Tanpa Pengoptimuman
Jika pengoptimuman dilumpuhkan (menggunakan -fno-elide-constructors), NRVO dinyahdayakan. Pembolehubah setempat akan dibina seperti biasa, salinan atau pemindahan akan dilakukan dan yang asal akan dimusnahkan.
Contoh
Pertimbangkan kod berikut:
class test { public: test(int p) { cout << "Constructor: " << this << endl; } test(test&& c) noexcept { cout << "Move Constructor: " << this << endl; } ~test() { cout << "Destructor: " << this << endl; } }; test function() { test i(8); return i; }
Output dengan Pengoptimuman (NRVO):
Constructor: 0x7fff78e42887 Destructor: 0x7fff78e42887
Output tanpa Pengoptimuman:
Constructor: 0x7ffda9d94fe7 Move Constructor: 0x7ffda9d95007 Destructor: 0x7ffda9d94fe7 Destructor: 0x7ffda9d95007
Dalam kes yang dioptimumkan, hanya satu objek dibina dan dimusnahkan. Dalam kes tidak dioptimumkan, dua objek dibina dan dimusnahkan kerana salinan sementara dibuat.
Atas ialah kandungan terperinci Adakah Mengembalikan Pembolehubah Tempatan dalam C 17 Memusnahkan Yang Asal?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!