我對C++中的可變變量有以下理解。可變變量內存位置
- 它是一個特殊的存儲類。
- 一個可變變量可以通過一個常量對象進行修改。
- 想要使用可變變量的情況的一個例子是,您不希望執行昂貴的操作來獲取結果,除非特別提出。如果具體詢問,你的程序將執行一次操作並將結果緩存在可變變量中。
我的問題是根據記憶。編譯器將內存中的可變變量存儲在哪裏?由於它是可修改的,所以它肯定不會是「只讀」內存。
我對C++中的可變變量有以下理解。可變變量內存位置
我的問題是根據記憶。編譯器將內存中的可變變量存儲在哪裏?由於它是可修改的,所以它肯定不會是「只讀」內存。
大概這是編譯器特定的,但我想大多數編譯器會簡單地選擇總是將具有可變成員的類(整個類)放到非const內存中以允許這樣做。
mutable
(mutable)只是編譯器的類型限定符,如const
或volatile
。 類的成員存儲在連續的內存塊上(除了靜態內存)。如果將成員定義爲const
,這並不意味着編譯器會將其放入RO內存中。 const
聲明在運行時不會生效,它只是編譯器在編譯期間執行適當檢查和優化的關鍵字。 一旦你將類(或方法)定義爲const
,但仍然需要修改該類的特定成員(例如互斥體或像您提到的那樣 - 爲了緩存值),您可以讓編譯器知道這個特定成員是mutable
,否則你會得到一個編譯錯誤。
它完全取決於編譯器,它可以執行轉義分析並確定對象永遠不會被修改,在這種情況下,它可能寫入二進制文件的read-only
部分。存儲類說明符只能放寬編譯時間要求。
雖然對象需要按聲明順序進行分配,所以無論存儲類說明符如何,所有變量都位於相同的內存區域中。但是,如果機器支持字節,則不會在const
字節區域上設置read-only
位。
該課程的所有成員都有一個尺寸(由sizeof
確定),它至少是1
。對於mutable
成員也是如此,並且意味着所有班級成員必須在內存中佔據一定範圍的位置。
mutable
成員唯一特別的地方就是它的值可以改變,即使它在const
對象中。編譯器如何實現這一點取決於它。通常,編譯器在編譯時強制執行。換句話說,如果一個對象是const
,其成員在邏輯上也是const
,並且試圖修改任何成員(或調用非const
操作),那麼除非該成員爲mutable
,否則代碼將不會編譯。
在運行時,實際上不需要const
對象或其成員彈出到只讀存儲器。如果這實際上已經完成,那麼即使對其他成員的更改被阻止,也需要進行一些特殊處理,以允許更改其成員mutable
。例如,所有對象的成員可能被放置在可修改的內存中,並且只有非易變的內容被標記(例如,具有操作系統支持),因此它們在運行時不能被更改。
使用可變成員的常見原因是存儲可重複的昂貴操作的結果(對相同的輸入給出相同的結果)。如果結果不需要,昂貴的操作也不需要。如果結果需要重複訪問,那麼可變成員允許第一次存儲結果,而不是重複執行昂貴的操作。
謝謝大家的寶貴意見! – Zoolander