簡體   English   中英

GCC可以使用讀 - 修改 - 寫指令來更新volatile變量嗎?

[英]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.

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