我讀LDD3,第7章,和我這句話:訪問volatile變量 - 從LLD3
」 ...的jiffies被聲明爲內核頭文件揮發,因此,從取任何時候一些C代碼都可以訪問內存。「
我不明白... 任何人都可以讓我更清楚嗎?如果一個變量不是不穩定的,當C代碼訪問它時會發生什麼?
我知道volatile告訴處理器不要對這個變量進行優化..但是訪問它的處理是什麼?
我讀LDD3,第7章,和我這句話:訪問volatile變量 - 從LLD3
」 ...的jiffies被聲明爲內核頭文件揮發,因此,從取任何時候一些C代碼都可以訪問內存。「
我不明白... 任何人都可以讓我更清楚嗎?如果一個變量不是不穩定的,當C代碼訪問它時會發生什麼?
我知道volatile告訴處理器不要對這個變量進行優化..但是訪問它的處理是什麼?
這意味着數據應該從原始內存位置被任何其他c代碼訪問時提取。當我們使用asm
代碼訪問任何內存位置時,它不使用優化技術。但是當我們使用c代碼時,它通常被優化,並且由於優化,它不會從原始存儲器位置獲取代碼。
volatile
告訴編譯器,由於外部條件,變量可能會改變它的值,這不僅是因爲程序本身的指令(這是正常情況)。如果沒有volatile
,編譯器會假定該變量的值沒有改變,因爲程序沒有修改它,即使它可以被另一個線程,內核或外部設備修改。
這種錯誤的假設可能會導致錯誤的優化,其中編譯器發出的代碼只加載一次該值,並且從不再從原始位置讀取它。
讓我們比較兩個代碼,而與volatile
:
int bla;
bla = 0;
delay_ms(10); // wait loop
printf("%d\n", bla);
在這種情況下,編譯器知道的bla
值0
所以編譯器可以直接使用0
爲printf
說法,甚至沒有閱讀bla
當printf
被稱爲。
volatile int bla;
bla = 0;
delay_ms(10); // wait loop
printf("%d\n", bla);
在這種情況下
對象是volatile
合格。這意味着在bla
已被分配到0
後,其值可能會突然變化,並不能保證爲0
了。它會強制編譯器在調用printf
時對bla
進行新的評估。
添加volatile
限定符告訴編譯器,對象的值可能以他未知的方式改變,因此編譯器無法對該對象的值做任何假設。
- >「,因此,只要某些C代碼訪問它,就會從內存中提取內存。」「 –