[英]Volatile semantics in 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实例的指针然后将其视为:
volatile struct x {
struct y * volatile bar;
};
或作为:
volatile struct x {
volatile struct y * volatile bar;
};
我已经阅读了C标准,对此并不是很清楚,我可以通过多种方式轻松解释这些措辞。
在你的例子中,你得到一个易失性指针,就是这样,波动性不会扩展到对象。
扩展我的答案volatile是一个轻松的原子,这意味着访问是原子的,但指令不会。 因此,您无法线程安全地增加或减少volatile,因此您不能使用volatile指针进行交互,只能使用store / load(assigment)操作。 对于int或其他数字也是如此,volatile也不能用于浮点数,因为它们是在FPU管道中处理的,而不是CPU。 总而言之,volatile并不太有用,但微软的编译器会自动将指令保护在挥发物周围,使其成为真正的原子价值,但这不是标准的一部分。
通过这里的标准阅读,似乎指针是易变的,但不是结构本身的实际内容。 我从给出的例子中解释了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指针
在一个实例中,结构是易失性的。 在另一个,指针。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.