首頁  >  文章  >  後端開發  >  在 C 17 中傳回局部變數會破壞原始變數嗎?

在 C 17 中傳回局部變數會破壞原始變數嗎?

DDD
DDD原創
2024-11-11 11:22:03876瀏覽

Does Returning a Local Variable in C  17 Destroy the Original?

回傳局部變數會破壞原始變數嗎?

在 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中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn