繁体   English   中英

C99中的易失性语义

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM