Linux ACCESS_ONCE宏定义如下:
#define ACCESS_ONCE(x) (*(volatile typeof(x) *)&(x))
Run Code Online (Sandbox Code Playgroud)
我明白这是做什么的,但想知道它为何如此复杂?我的理解是它做了以下事情:
任何想法为什么不以更简单的方式实现,说:
#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了比这更糟糕的事情.