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

按值返回局部變數會破壞原始物件嗎?

DDD
發布: 2024-11-09 13:15:02
原創
782 人瀏覽過

Does Returning a Local Variable by Value Destroy the Original Object?

複製消除和物件生命週期

當按值傳回局部變數時,人們可能會想知道原始物件是否被銷毀。答案在於理解複製省略。

使用複製省略(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中文網其他相關文章!

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