簡體   English   中英

c中的volatile和指針變量之間的區別

[英]Difference between a volatile and a pointer variable in c

volatile和指針變量都從地址獲取值而不是優化,因此明顯的不同。

volatile是一個存儲類,還有registerstaticexternal volatile表示volatile變量的值可以通過正在運行的程序以外的其他力來更改,因此編譯器必須小心,不要在每次使用時優化獲取變量的新副本。

指針包含一個存儲單元的地址。 要訪問它所指向的內容,必須將其取消引用。

易失性是指示編譯器比使用寄存器中存儲的值重新從存儲器位置取值。 這是因為內存位置可能已更新(例如,通過其他線程)。 那就是

從地址獲取值

不充當指針。 您也可以使非指針變量(例如,原始變量)易失。
因此,將重新獲取一個int變量,而不使用寄存器中存儲的值。
它還會強制執行與讀/寫有關的某些語義(但這與您的OP不相關)

Volatile是一種存儲類,它告訴編譯器每次訪問時從內存中獲取值,並在每次寫入時將其寫入。 通常在程序以外的某些實體也可能更改某個地址的值時使用。

編譯器以多種方式優化程序。 例如,如果您有以下代碼:

int *ptr=0x12345678;
int a;
*ptr=0x10;
a=*ptr;

然后編譯器可以優化語句a=*ptr; a=0x10; 以避免內存訪問。 理由是因為您只寫了0x10; 到* ptr,因此當您閱讀* ptr時,您將得到0x10。

在正常情況下,此假設是正確的,但請考慮以下情況:地址0x12345678是嵌入式系統UART的某些內存映射寄存器的地址,向其寫入0x10會告訴它從連接的控制台讀取字符。 然后將讀取的字符寫回到地址0x12345678,以便用戶從那里獲取。 現在,在這種情況下,以上優化將導致問題。 因此,您需要讓編譯器在每次訪問指針時都讀取/寫入指向該指針的值,而不是優化對其的訪問。 因此,您將指針ptr聲明為volatile,告訴編譯器不要優化對其的訪問。

volatile int *ptr=0x12345678;

暫無
暫無

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

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