傳回局部變數是否回傳副本並銷毀原始變數(NRVO)?
簡介:
此題檢視 C 中傳回局部變數的行為。具體來說,它探討了傳回的物件是副本還是原始對象,以及它如何影響局部變數的銷毀。
傳回值最佳化(NRVO):
With啟用NRVO(命名回傳值最佳化)後,編譯器會最佳化回傳語句,以避免不必要的複製構造或局部變量的破壞。它透過直接將返回物件建構到目標儲存中來實現這一點,消除了中間複製或移動的開銷。 NRVO 在滿足特定條件時適用,例如具有自動儲存期限且與傳回類型相同的局部變數。
啟用 NRVO 的範例:
考慮以下程式碼:
class Test { public: Test(int p) { std::cout啟用 NRVO 後,輸出將為:
Constructor called Destructor called,在這種情況下,NRVO 優化了 return 語句,將物件 o 直接建構到局部變數 t 的儲存中。建構函式被呼叫一次,並且只為物件 o 呼叫一個析構函式。
停用 NRVO 的範例:
但是,可以使用 -fno-elide- 停用 NRVO建構函式編譯器標誌。如果沒有 NRVO,編譯器將明確執行複製構造和銷毀步驟。Constructor called Constructor called Destructor called Destructor called在這種情況下,建構函式被呼叫兩次(對於局部變數 t 和返回物件 o)。此外,局部變數 t 和回傳物件 o 都被單獨破壞。
結論:
傳回局部變數的行為取決於 NRVO 是否啟用或停用。啟用 NRVO 後,局部變數會被最佳化掉,並且僅針對返回物件呼叫構造函數和析構函數一次。如果沒有 NRVO,複製構造和銷毀步驟將明確執行,可能會多次呼叫構造函數和析構函數。
免責聲明: 提供的所有資源部分來自互聯網,如果有侵犯您的版權或其他權益,請說明詳細緣由並提供版權或權益證明然後發到郵箱:[email protected] 我們會在第一時間內為您處理。
Copyright© 2022 湘ICP备2022001581号-3