簡體   English   中英

為什么 glibc 中 x86 的讀寫屏障不使用 __volatile asm?

[英]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語句是隱式volatileGCC 手冊)。
所以它們實際上都是volatile ,這是優化器不會刪除它們所必需的。

(假定非易失volatile asm 是一個沒有副作用的純函數,僅在需要產生輸出時運行。僅當優化器決定它需要運行 asm 語句時才會破壞 clobber)。

不同的作者選擇或多或少是明確的。 如果你git blame ,我希望你會看到那些是在不同的時間和/或由不同的人編寫的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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