簡體   English   中英

C ++中的volatile與mutable

[英]volatile vs. mutable in C++

我對volatile和mutable之間的區別有疑問。 我注意到這兩個都意味着它可以改變。 還有什么? 它們是一樣的嗎? 有什么不同? 它們適用於哪里? 為什么提出這兩個想法? 如何以不同的方式使用它們?

非常感謝。

即使在通過const指針或引用訪問的對象中,或在const對象中,也可以更改mutable字段,因此編譯器知道不將其存儲在R / O存儲器中。 volatile位置是可以通過編譯器不知道的代碼(例如某些內核級驅動程序)更改的位置,因此編譯器知道不會在無效假設值“不可能”的情況下優化例如該值的寄存器賦值已更改“因為它最后一次加載到該寄存器中。 為編譯器提供了非常不同類型的信息,以阻止非常不同類型的無效優化。

mutable :mutable關鍵字覆蓋任何封閉的const語句。 可以修改const對象的可變成員。

volatile :volatile關鍵字是一個依賴於實現的修飾符,在聲明變量時使用,這會阻止編譯器優化這些變量。 Volatile應該與變量一起使用,其值可能以意外的方式(即通過中斷)發生變化,這可能與編譯器可能執行的優化沖突。

資源

他們絕對不是一回事。 Mutable與const交互。 如果你有一個const指針,你通常無法更改成員。 Mutable為該規則提供了一個例外。

另一方面,易失性與程序的變化完全無關。 這意味着內存可能因編譯器無法控制的原因而發生更改,因此編譯器必須每次都讀取或寫入內存地址,並且無法將內容緩存在寄存器中。

一種粗略但有效的思維方式是:

  • 編譯器知道可變對象何時更改。
  • 編譯器無法知道volatile對象何時發生更改。

標記為mutable的變量允許在聲明為const的方法中對其進行修改。

標記為volatile的變量告訴編譯器每次代碼都告訴它必須讀/寫變量(即它不能優化對變量的訪問)。

我想補充一點,volatile在處理多線程應用程序時也非常有用,也就是說,你有主線程(main()存在),並且你產生一個工作線程,當變量“app_running”為真時它會繼續旋轉。 main()控制“app_running”是真還是假,所以如果你沒有將volatile屬性添加到“app_running”的聲明中,如果編譯器優化了對輔助線程運行的代碼中“app_running”的訪問,則為main( )可能會將“app_running”更改為false,但輔助線程將繼續運行,因為該值已被緩存。 我在Linux和VisualC ++上使用gcc看到過相同的行為。 放入“app_running”聲明的“volatile”屬性解決了這個問題。 因此,這是在更改此類變量的值時不會發生硬件中斷或內核的情況。

暫無
暫無

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

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