[英]Can GCC use read-modify-write instructions to update volatile variables?
假設您有x86系統代碼的C代碼,如下所示:
volatile uint32_t *reg = (volatile uint32_t *)0xCAFEBABE;
// ...
reg[0x10] |= 1;
GCC可以在這里自由生成讀 - 修改 - 寫指令嗎? 如果是這樣,將封裝讀取和寫入函數中的volatile變量確保GCC不將訪問組合到單個RMW指令中?
我知道C規范對此有意模糊。
C標准沒有規定使用什么指令。 對於像這樣的簡單更新, gcc
最有可能生成單個RMW指令的樣式
orl (%rdx), $1
volatile
關鍵字與它無關。 load, modify, store
任何組合也都是有效的。 volatile
關鍵字僅告訴編譯器在每次使用時從內存重新加載值,而不是使用寄存器緩存優化。
如果你想要原子更新,那么你需要原子,gcc提供了這個_sync_fetch_and_or(type *, type)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.