[英]Why do read and write barrier for x86 in glibc not use __volatile asm?
我正在學習 glibc(版本是 2.32)。 至於內存屏障,x86的讀、寫和滿屏障如下:
#define atomic_full_barrier() \
__asm __volatile (LOCK_PREFIX "orl $0, (%%" SP_REG ")" ::: "memory")
#define atomic_read_barrier() __asm ("" ::: "memory")
#define atomic_write_barrier() __asm ("" ::: "memory")
正如cppreference和這個答案所說, volatile
告訴編譯器不要優化和重新排序這條指令。
為什么寫和讀屏障不使用__asm __volatile
,而完全屏障使用它?
沒有輸出操作數的asm
語句是隱式volatile
( GCC 手冊)。
所以它們實際上都是volatile
,這是優化器不會刪除它們所必需的。
(假定非易失volatile
asm 是一個沒有副作用的純函數,僅在需要產生輸出時運行。僅當優化器決定它需要運行 asm 語句時才會破壞 clobber)。
不同的作者選擇或多或少是明確的。 如果你git blame
,我希望你會看到那些是在不同的時間和/或由不同的人編寫的。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.