了解局部變數的回傳行為
從函數傳回局部變數時,其行為可能會因編譯器最佳化而異。
NRVO(命名回傳值最佳化)
啟用 NRVO 時,編譯器會透過在傳回值處直接建立傳回的物件來最佳化回傳語句。在這種情況下,不會執行任何複製,返回後原始物件將被銷毀。
啟用NRVO 的輸出
// 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; }
輸出:
Constructor (test(int p)) called Destructor called
要停用NRVO,請在編譯期間使用-fno-elide-constructors 標誌。在這種情況下,編譯器不會執行 NRVO,並在傳回值中建立物件的副本。
禁用NRVO 的輸出輸出:
// 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; }
總結
Constructor (test(int p)) called Constructor (test(test&& other)) called Destructor called Destructor called
啟用NRVO 後,返回局部變數無需副本,直接在返回站點構造對象,並立即銷毀原始對象。
停用 NRVO 後,將建立並傳回物件的副本,從而產生物件的兩個副本。以上是命名回傳值最佳化 (NRVO) 如何影響局部變數回傳行為?的詳細內容。更多資訊請關注PHP中文網其他相關文章!