傳回局部變數是否會傳回副本並銷毀原始變數(NRVO)?
簡介:
該問題檢查在 C 中傳回局部變數的行為。具體來說,它探討了傳回的物件是副本還是原始對象,以及它如何影響局部變數的銷毀。
傳回值最佳化(NRVO):
與啟用NRVO(命名回傳值最佳化)後,編譯器會最佳化回傳語句,以避免不必要的複製構造或局部變量的破壞。它透過直接將返回物件建構到目標儲存中來實現這一點,消除了中間複製或移動的開銷。 NRVO 在滿足特定條件時適用,例如具有自動儲存期限且與傳回類型相同的局部變數。
啟用NRVO 的範例:
考慮以下程式碼:
class Test { public: Test(int p) { std::cout << "Constructor called" << std::endl; } ~Test() { std::cout << "Destructor called" << std::endl; } }; Test function() { Test t(5); // local variable with automatic storage duration return t; // return local variable } int main() { Test o = function(); return 0; }
啟用NRVO 後,輸出將為:
Constructor called Destructor called
啟用NRVO 後,輸出將為:
在這種情況下,NRVO 優化了return 語句,並將物件o 直接建構到儲存中局部變數t。建構函式被呼叫一次,並且只為物件 o 呼叫一個析構函式。
Constructor called Constructor called Destructor called Destructor called
但是,可以使用 -fno-elide- 停用 NRVO建構函式編譯器標誌。如果沒有 NRVO,編譯器將明確執行複製構造和銷毀步驟。
在這種情況下,建構函式被呼叫兩次(對於局部變數 t 和回傳物件 o)。此外,局部變數 t 和回傳物件 o 都會分別被破壞。
以上是在 C 中傳回局部變數是否利用命名回傳值最佳化 (NRVO) 來避免複製構造和銷毀?的詳細內容。更多資訊請關注PHP中文網其他相關文章!