Memahami Gelagat Pengembalian Pembolehubah Setempat
Apabila mengembalikan pembolehubah tempatan daripada fungsi, gelagatnya boleh berbeza-beza bergantung pada pengoptimuman pengkompil.
NRVO (Dinamakan Pengoptimuman Nilai Pulangan)
Apabila NRVO didayakan, pengkompil mengoptimumkan pernyataan pulangan dengan mencipta objek yang dikembalikan terus di tapak nilai pulangan. Dalam kes ini, tiada salinan dilakukan dan objek asal dimusnahkan selepas pemulangan.
Output dengan NRVO Didayakan
// With NRVO enabled, only one constructor and destructor call is made. class test { public: test(int p) { std::cout << "Constructor (test(int p)) called\n"; } ~test() { std::cout << "Destructor called\n"; } }; test function() { test i(8); return i; } int main() { test o = function(); return 0; }
Output:
Constructor (test(int p)) called Destructor called
NRVO Dilumpuhkan
Untuk melumpuhkan NRVO, gunakan bendera -fno-elide-constructors semasa penyusunan. Dalam kes ini, pengkompil tidak melaksanakan NRVO, dan salinan objek dibuat dalam nilai pulangan.
Output dengan NRVO Disabled
// With NRVO disabled, both constructor and destructor calls are made twice. class test { public: test(int p) { std::cout << "Constructor (test(int p)) called\n"; } test(test&& other) { std::cout << "Constructor (test(test&& other)) called\n"; } ~test() { std::cout << "Destructor called\n"; } }; test function() { test i(8); return i; } int main() { test o = function(); return 0; }
Output :
Constructor (test(int p)) called Constructor (test(test&& other)) called Destructor called Destructor called
Ringkasan
Atas ialah kandungan terperinci Bagaimanakah Pengoptimuman Nilai Pulangan Dinamakan (NRVO) Mempengaruhi Gelagat Pulangan Pembolehubah Setempat?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!