回傳局部變數會破壞原始變數嗎?
在 C 17 中,傳回局部變數是否回傳副本或破壞原始變數取決於是否啟用最佳化。
啟用最佳化(NRVO)
啟用最佳化(稱為命名回傳值最佳化或NRVO)後,編譯器可以直接將傳回的物件建構到要複製/移動到的儲存空間中。這意味著原始局部變數不會被破壞。
不進行最佳化
如果停用最佳化(使用 -fno-elide-constructors),則停用 NRVO。局部變數將正常構造,將執行複製或移動,原始變數將被銷毀。
範例
考慮以下程式碼:
class test { public: test(int p) { cout << "Constructor: " << this << endl; } test(test&& c) noexcept { cout << "Move Constructor: " << this << endl; } ~test() { cout << "Destructor: " << this << endl; } }; test function() { test i(8); return i; }
最佳化輸出(NRVO):
Constructor: 0x7fff78e42887 Destructor: 0x7fff78e42887
未最佳化的輸出:
Constructor: 0x7ffda9d94fe7 Move Constructor: 0x7ffda9d95007 Destructor: 0x7ffda9d94fe7 Destructor: 0x7ffda9d95007
在最佳化情況下,僅建構和銷毀一個物件。在未最佳化的情況下,由於製作了臨時副本,兩個物件被建構和銷毀。
以上是在 C 17 中傳回局部變數會破壞原始變數嗎?的詳細內容。更多資訊請關注PHP中文網其他相關文章!