複製消除和物件生命週期
當按值傳回局部變數時,人們可能會想知道原始物件是否被銷毀。答案在於理解複製省略。
使用複製省略(NRVO)
啟用最佳化(稱為命名回傳值最佳化或NRVO)時,編譯器可能會透過將物件直接建構到本來會複製到的儲存體中來最佳化返回語句。因此,最初並沒有創建原始物件。
啟用NRVO 的示例
考慮以下代碼:
class Test { public: Test(int p) { cout << "Constructor called" << endl; } ~Test() { cout << "Destructor called" << endl; } }; Test function() { Test t(5); return t; } int main() { Test o = function(); return 0; }
啟用NRVO 後,輸出將是:
Constructor called Destructor called
僅建構和銷毀物件o,並且原始物件t 被最佳化掉。
沒有複製消除
停用最佳化時(例如 -fno-elide-constructors),返回語句將遵循通常的複製/移動語意。
禁用NRVO 的範例
使用上面禁用NRVO 的程式碼,輸出將是:
Constructor called Constructor called Destructor called Destructor called
這次,物件t 和o 都被建構和銷毀,因為複製/移動構造不能
結論
按值傳回局部變數是否會破壞原始物件取決於是否啟用了NRVO。使用 NRVO,原始物件可能會被刪除,而如果沒有 NRVO,它將按照標準複製/移動語義進行複製/移動。
以上是按值返回局部變數會破壞原始物件嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!