2015-08-16 36 views
3

我對C++中的可變變量有以下理解。可變變量內存位置

  1. 它是一個特殊的存儲類。
  2. 一個可變變量可以通過一個常量對象進行修改。
  3. 想要使用可變變量的情況的一個例子是,您不希望執行昂貴的操作來獲取結果,除非特別提出。如果具體詢問,你的程序將執行一次操作並將結果緩存在可變變量中。

我的問題是根據記憶。編譯器將內存中的可變變量存儲在哪裏?由於它是可修改的,所以它肯定不會是「只讀」內存。

+0

謝謝大家的寶貴意見! – Zoolander

回答

2

大概這是編譯器特定的,但我想大多數編譯器會簡單地選擇總是將具有可變成員的類(整個類)放到非const內存中以允許這樣做。

3

mutablemutable)只是編譯器的類型限定符,如constvolatile。 類的成員存儲在連續的內存塊上(除了靜態內存)。如果將成員定義爲const,這並不意味着編譯器會將其放入RO內存中。 const聲明在運行時不會生效,它只是編譯器在編譯期間執行適當檢查和優化的關鍵字。 一旦你將類(或方法)定義爲const,但仍然需要修改該類的特定成員(例如互斥體或像您提到的那樣 - 爲了緩存值),您可以讓編譯器知道這個特定成員是mutable,否則你會得到一個編譯錯誤。

2

它完全取決於編譯器,它可以執行轉義分析並確定對象永遠不會被修改,在這種情況下,它可能寫入二進制文件的read-only部分。存儲類說明符只能放寬編譯時間要求。

雖然對象需要按聲明順序進行分配,所以無論存儲類說明符如何,所有變量都位於相同的內存區域中。但是,如果機器支持字節,則不會在const字節區域上設置read-only位。

1

該課程的所有成員都有一個尺寸(由sizeof確定),它至少是1。對於mutable成員也是如此,並且意味着所有班級成員必須在內存中佔據一定範圍的位置。

mutable成員唯一特別的地方就是它的值可以改變,即使它在const對象中。編譯器如何實現這一點取決於它。通常,編譯器在編譯時強制執行。換句話說,如果一個對象是const,其成員在邏輯上也是const,並且試圖修改任何成員(或調用非const操作),那麼除非該成員爲mutable,否則代碼將不會編譯。

在運行時,實際上不需要const對象或其成員彈出到只讀存儲器。如果這實際上已經完成,那麼即使對其他成員的更改被阻止,也需要進行一些特殊處理,以允許更改其成員mutable。例如,所有對象的成員可能被放置在可修改的內存中,並且只有非易變的內容被標記(例如,具有操作系統支持),因此它們在運行時不能被更改。

使用可變成員的常見原因是存儲可重複的昂貴操作的結果(對相同的輸入給出相同的結果)。如果結果不需要,昂貴的操作也不需要。如果結果需要重複訪問,那麼可變成員允許第一次存儲結果,而不是重複執行昂貴的操作。