3 回答

TA貢獻1998條經驗 獲得超6個贊
volatile 如果要從內存中某個完全是獨立的進程/設備/進行任何寫入的位置讀取數據,則需要使用此命令。
我曾經在直接C語言的多處理器系統中使用雙端口ram。我們使用硬件管理的16位值作為信號量來了解其他人何時完成。本質上,我們這樣做:
void waitForSemaphore()
{
volatile uint16_t* semPtr = WELL_KNOWN_SEM_ADDR;/*well known address to my semaphore*/
while ((*semPtr) != IS_OK_FOR_ME_TO_PROCEED);
}
如果不使用volatile,則優化器將認為該循環是無用的(該家伙從未設置過該值!他真是瘋了,擺脫了該代碼?。?,而我的代碼將在沒有獲得信號量的情況下繼續進行,從而導致以后出現問題。

TA貢獻1773條經驗 獲得超3個贊
volatile在開發嵌入式系統或設備驅動程序(需要讀取或寫入內存映射的硬件設備)時需要。特定設備寄存器的內容可以隨時更改,因此您需要使用volatile關鍵字來確保編譯器不會對此類訪問進行優化。

TA貢獻1797條經驗 獲得超4個贊
某些處理器的浮點寄存器的精度超過64位(例如,不帶SSE的32位x86,請參見Peter的評論)。這樣,如果您對雙精度數字運行多個運算,則實際上得到的精度要比將每個中間結果截斷為64位的精度更高。
通常這很好,但這意味著根據編譯器如何分配寄存器和進行優化,對于完全相同的輸入,完全相同的操作將產生不同的結果。如果需要一致性,則可以使用volatile關鍵字強制每個操作返回到內存。
對于某些沒有代數意義但減少浮點誤差的算法(例如Kahan求和),它也很有用。從代數角度講,這是一個小問題,因此除非某些中間變量不穩定,否則它經常會被錯誤地優化。
- 3 回答
- 0 關注
- 390 瀏覽
添加回答
舉報