首頁 > 後端開發 > C++ > 主體

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

DDD
發布: 2024-11-11 11:22:03
原創
860 人瀏覽過

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

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板