在學習 C 和 C 時,有人告訴我:
- 每個變數都有自己的記憶體塊
- 并且該塊記憶體的地址在變數的生命周期內永遠不會改變。
所以我想知道這兩個陳述實際上是真的嗎?是否有可能擁有不以自己的記憶結束的變數?
例如
int a = 1
int b = a
在上面的例子中,有可能任何變數都沒有分配到它們的專用記憶體塊嗎?例如,當變數直接加載到暫存器中而不首先存盤在記憶體中時?
uj5u.com熱心網友回復:
C 標準允許 C 編譯器執行任何沒有明顯效果的優化。
如果您的 C 編譯器可以向自己證明,例如,b僅用作別名 fora不會產生明顯的影響,則允許但沒有義務編譯這種優化,該優化將具有b根本不存在的效果,并且不使用任何記憶體;以及所有b實際使用a.
但是您絕對無法知道這一點,除非通過外部方式,例如使用外部除錯器,也許。如果您有辦法在 C 程式的背景關系中知道這一點,那么當然,進行這種優化會產生明顯的效果,而您的 C 編譯器不會這樣做。
uj5u.com熱心網友回復:
@SamVarshavchik 專注于實施。
但是從語言的角度來看,只有register變數是保證沒有參考的(即使實作會把它放在記憶體中)。所有其他物件都有對它們的參考——因此它們在記憶體中有表示。
實作可能會選擇如何處理這些物件(優化它們,將它們放入暫存器等)。
但是,如果您使用對物件的參考,它將在記憶體中表示。
每個變數都有自己的記憶體塊,并且該記憶體塊的地址在變數的生命周期內永遠不會改變。
如果使用參考,這是可觀察到的行為。
https://godbolt.org/z/K36zxKozE
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/413507.html
標籤:
