簡體   English   中英

c ++中的rvalues如何存儲在內存中?

[英]How are rvalues in c++ stored in memory?

努力學習lvaluesrvalues和內存分配他們。 因此,有很多學習材料會有一些混亂。

rvalue是一個值,只需要在創建它的表達式的邊界中存在(至少在C ++ 11之前)。 所以它有一個占據的地址和內存塊。 但根據定義,我們無法獲得rvalue的地址,因為與lvalue相比,它是一個臨時對象。 但即使在C ++ 11之前,我們也可以通過從函數返回並將其保存為const引用類型(呃,我猜不是地址而是值)來獲取rvalue的地址。

那么,更確切地說, rvalue分配如何工作? 程序或操作系統有多長時間真正記住了創建rvalue並標記為已分配的內存位置,而另一個對象無法取代它?

我怎么看,現在rvalues就像lvalues一樣存儲,但我們只是有其他權限來訪問它們。 他們有其他類型的釋放的-為lvalues走出去的范圍,為rvalues可能存在表達的界限或直到沒有更多的聯系,以對它進行優化。

簡短回答:它依賴於實現。

這背后的主要原因是編譯器始終可以自由地提高代碼的性能。 理解這一點的一個更具體的方法是記住,一個值可以存儲在CPU的寄存器中,而不是實際存在於您的內存中,這或多或少意味着該值沒有地址。 我不會打賭我所擁有的一切,但這可能是“我們無法得到一個rvalue的地址”的主要原因之一。

在更一般的方式中,因為rvalue在語義上是臨時的,所以更可能被放置在臨時位置或者以不能容易地映射到地址的方式進行優化,並且即使它可以在性能方面反作用。

從概念上講,rvalues生活在“堆棧”上。 如果你到達他們的地址,它在概念上是堆棧中的某個地址。 如果根本不采用該地址,只要編譯器設置正確的指令使其看起來好像是創建的那樣 ,該實體就永遠不會真正存在。

即使真正創建實體的位置取決於各種各樣的東西,它甚至可能最終都不在堆棧中:它可能位於當前堆棧幀中,但它也可能是其他堆棧幀或某些目標如果rvalue最終被復制/移動到那里並且編譯器執行copy-elision。 如果rvalue最終被綁定到const&那么它也可能位於其他地方,如果它沒有。

rvalue的生命周期受語言規則的約束。 實際實現的方式在很大程度上取決於編譯器和/或它所遵循的ABI。

暫無
暫無

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

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