簡體   English   中英

將變量移至外部作用域時,堆棧會發生什么情況?

[英]What happens to the stack when moving a variable to an outer scope?

我想我了解堆棧的工作原理以及移動變量后會發生什么,但是我找不到這個問題的答案。 讓我解釋:

輸入/創建新作用域時,將在堆棧頂部獲取一定數量的內存。 堆棧指針指向該存儲器。 它代表堆棧的當前大小。 當示波器離開時,通過使堆棧指針返回其先前位置來釋放內存。

在C ++ 11或更高版本中移動語義,將某些數據的所有權從一個變量轉移到另一個變量。 這樣可以避免復制數據,因為保存數據的內存保持不變。 移動后,move-to變量指向數據在內存中的位置,move-from變量基本上變為空指針。 在這里,我可能犯了我的第一個錯誤,因為將移動語義與指針聯系得太緊密了。 是嗎

實際的問題:在內部作用域中創建變量,然后將其移動到外部作用域中的變量。 然后內部范圍退出。 堆棧會發生什么?

鑒於以上所述,堆棧指針應返回其先前位置並釋放內部作用域內存。 但是它不能這樣做,因為內部作用域的內存仍然有效,因為它現在已附加到外部作用域變量。 在外部(可能是全局)作用域和以前的內部作用域內存之間可能有很多內存被阻止/浪費。 一旦外部示波器退出,該內存將再次變為可用。 在此之前,堆棧大小會膨脹。 這是真的? 可以避免嗎? 編譯器可以防止這種情況嗎?

免責聲明,外行術語,狡猾的類比和不穩定的C ++知識...

我想我理解你的困惑,

[stack frame a]
std::vector toPopulate;
    [stack frame b]
    std::vector toMove; // will be std::moved into `toPopulate` somehow

當堆棧范圍離開b並返回到a ,此move如何防止任何復制,因為您顯然無法將內存留在堆棧幀b ...

答:不是! toMove的堆棧數據復制到toPopulatestd::vector不將其內容存儲在堆棧中,它僅存儲指向內存在堆中的地址/指針。

std::move在這里所做的是對vector說不要深深地復制自己(不要將堆數據復制到堆中的另一個位置),只需復制data指針,相信我,這是安全的,在編譯時強制執行安全性。

所以toPopulate構造,其DATACOUNT和dataPointer和其他任何可能需要描述一個std ::向量被寫入/復制到堆內存,但你的堆數據沒有被觸及,也不是以往由多個擁有std::vectors在堆棧中,這確實很麻煩!

暫無
暫無

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

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