我有一些低级代码我写,我需要使用对象为挥发性的问题,但它不一定是这样,我想声明的类型为挥发性(可重用的原因).但是,我可以定义指向结构的限定变体的指针,如以下段中所述.
struct x {
int bar;
};
struct x foobar;
...
volatile struct x *foo = &foobar;
Run Code Online (Sandbox Code Playgroud)
现在foo实际上是指向该类型对象的指针:
volatile struct x {
volatile int x;
};
Run Code Online (Sandbox Code Playgroud)
因为volatile适用于所有struct成员.现在我的问题是当一个对象包含指向另一个对象的指针时,如何应用波动性?
struct x {
struct y *bar;
};
Run Code Online (Sandbox Code Playgroud)
指向x的volatile实例的指针然后将其视为:
volatile struct x {
struct y * volatile bar;
};
Run Code Online (Sandbox Code Playgroud)
或作为:
volatile struct x {
volatile struct y * volatile bar;
};
Run Code Online (Sandbox Code Playgroud)
我已经阅读了C标准,对此并不是很清楚,我可以通过多种方式轻松解释这些措辞.
在您的示例中,您得到一个易失性指针,仅此而已,易变性并未扩展到对象。
扩展我的答案 易失性是一个宽松的原子,这意味着访问是原子的,但指令不是。因此,您无法线程安全地递增或递减易失性,因此您无法使用易失性指针进行交互,只能使用存储/加载(分配)操作。对于 int 或其他数字也是如此,并且 volatile 也不适用于浮点数,因为它们是在 FPU 管道中处理的,而不是在 CPU 中处理的。总而言之,易失性并不是很有用,但微软的编译器会自动在易失性周围放置指令保护,使它们成为真正的原子值,但这不是标准的一部分。