为什么ACCESS_ONCE如此复杂?

use*_*510 8 c linux-kernel

Linux ACCESS_ONCE宏定义如下:

#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))
Run Code Online (Sandbox Code Playgroud)

我明白这是做什么的,但想知道它为何如此复杂?我的理解是它做了以下事情:

  1. 获取关注变量的地址(创建临时指针)
  2. 将此转换为相同类型的易失性指针
  3. 取消引用该指针

任何想法为什么不以更简单的方式实现,说:

 #define ACCESS_ONCE(x) ((volatile typeof(x))(x))
Run Code Online (Sandbox Code Playgroud)

dav*_*pfx 10

ACCESS_ONCE宏用于从已知(或怀疑)为易失性但未按类型输入的存储位置检索值的情况.目的是以这样的方式检索存储位置的当前值,以便击败可能以其他方式将值缓存在寄存器中的优化编译器,或甚至根本不提供存储位置.

所写的构造通过声明指向该位置的适当类型的指针来间接地将"volatile"应用于存储位置.根据C标准,这要求object be evaluated strictly according to the rules of the abstract machine.

您提议的修改不适volatile用于存储位置,因此无法实现此目的.值检索可以进行优化.

顺便说一句,我认为这是所述目的的简明模型.我保留complex了比这更糟糕的事情.