C99中的易失性语义
我遇到了一些我正在编写的低级代码的问题,我需要将对象用作volatile,但不一定是因为我希望将类型声明为volatile(出于可重用性的原因)。 但是,我可以定义指向结构的限定变体的指针,如以下段中所述。
struct x { int bar; }; struct x foobar; ... volatile struct x *foo = &foobar;
现在foo实际上是指向该类型对象的指针:
volatile struct x { volatile int x; };
因为volatile适用于所有struct成员。 现在我的问题是当一个对象包含指向另一个对象的指针时,如何应用波动性?
struct x { struct y *bar; };
指向x的易变实例然后将其视为:
volatile struct x { struct y * volatile bar; };
或作为:
volatile struct x { volatile struct y * volatile bar; };
我已经阅读了C标准,对此并不十分清楚,我可以通过多种方式轻松解释措辞。
在你的例子中,你得到一个易失性指针,就是这样,波动性不会扩展到对象。
扩展我的答案volatile是一个轻松的primefaces,这意味着访问是primefaces的,但指令不会。 因此,您无法线程安全地增加或减少volatile,因此您不能使用volatile指针进行交互,只能使用store / load(assigment)操作。 对于int或其他数字也是如此,volatile也不能用于浮点数,因为它们是在FPU管道中处理的,而不是CPU。 总而言之,volatile并不是太有用,但微软的编译器会自动将指令保护在挥发物周围,使它们成为真正的primefaces价值,但这不是标准的一部分。
通过这里的标准阅读,似乎指针是易失性的,但不是结构本身的实际内容。 我从给出的例子中解释了const t * volatile p
(在链接的底部)。 然而,措辞含糊不清,但我认为这是一个类似的例子:
struct foo { int bar; }; struct foo *volatile x;
请注意,我没有试过这个,所以我可能会非常不正确…这只是我从标准的粗略读物中收集到的。
此外,cdecl确实清除了一些模糊性。 例如:
cdecl>解释
volatile struct x* foo
将foo声明为volatile x的指针
鉴于:
cdecl>解释
struct x* volatile foo
将foo声明为struct x的volatile指针
在一个实例中,结构是易失性的。 在另一个,指针。