簡體   English   中英

C ++移動構造函數和范圍

[英]C++ move constructor and scope

如果我在堆棧上聲明了一個對象,並且我返回對它的引用,我相信我將無法再訪問它,因為它超出了范圍。 正確?

如果我只返回對象本身(不是對它的引用)怎么辦? 是否會調用復制構造函數? (我聽過“移動構造函數”這個術語,但從我讀到的內容來看,這似乎是一個新功能。任何人都能詳細說明一下嗎?)

在什么情況下會調用析構函數?

如果我在堆棧上聲明了一個對象,並且我返回對它的引用,我相信我將無法再訪問它,因為它超出了范圍。 正確?

正確,析構函數將在超出范圍時被調用。

如果我只返回對象本身(不是對它的引用)怎么辦? 是否會調用復制構造函數?

可以調用復制構造函數和析構函數,但通常編譯器將執行返回值優化,並且不會進行復制,析構或移動。

要了解移動構造函數,請閱讀移動語義和右值引用。

如果我在堆棧上聲明了一個對象,並且我返回對它的引用,我相信我將無法再訪問它,因為它超出了范圍。 正確?

正確和許多編譯器也會給你警告。

如果我只返回對象本身(不是對它的引用)怎么辦? 是否會調用復制構造函數?

它會調用復制構造函數。 標准的std :: array沒有定義為std :: move構造函數,因為它在內部使用堆棧內存。 因此將調用復制構造函數。

在什么情況下會調用析構函數?

在這兩種情況下,析構函數都會被調用。 它只是在移動構造函數之后,我們將所有指針/處理移動到其他對象,因此對象狀態將是一種空(但是一致)。

編譯器將嘗試優化此類函數以消除復制操作。 生成的代碼將表現為對象是在函數將以適當的生命周期返回的位置創建的。 參考這里 這取決於編譯器,以及構造和使用點處代碼本身的結構。 也可能無法進行優化,在這種情況下,如果可用,您可能會調用復制或移動構造函數。

如果編譯器優化了該函數,那么當使用點處的對象超出最近的塊范圍時,將調用析構函數。

如果沒有優化,那么對象將被復制到另一個使用點(一次調用復制/移動構造函數),然后函數中的對象將被銷毀(如果被復制),最后復制的析構函數為/當移動對象在函數返回的位置離開最近的塊作用域時(使用點)將被調用。

但是,如果從函數返回臨時函數,則會返回一個引用或指向破壞內存的指針,因為臨時函數將在函數返回時超出范圍並被銷毀。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM