C99 中的易失性语义

2024-02-04

我对我正在编写的一些低级代码有疑问,我需要将对象用作易失性的,但这不一定是我希望将类型声明为易失性的(出于可重用性原因)。然而,我可以定义指向结构的限定变体的指针,如下段所述。

struct x {
  int bar;
};

struct x foobar;
...
volatile struct x *foo = &foobar;

现在 foo 实际上是一个指向以下类型的对象的指针:

volatile struct x {
  volatile int x;
};

因为 volatile 适用于所有结构成员。现在我的问题是,当一个对象包含指向另一个对象的指针时,如何应用易失性?

struct x {
  struct y *bar;
};

指向 x 的易失性实例的指针会将其视为:

volatile struct x {
  struct y * volatile bar;
};

or as:

volatile struct x {
  volatile struct y * volatile bar;
};

我通读了C标准,对此并不是很清楚,我可以轻松地以多种方式解释该措辞。


在你的例子中你 得到一个易失性指针,仅此而已,易失性并没有扩展到对象。

扩展我的答案 易失性是一个宽松的原子,这意味着访问是原子的,但指令不是。因此,您无法线程安全地递增或递减易失性,因此您无法使用易失性指针进行交互,只能使用存储/加载(分配)操作。 对于 int 或其他数字也是如此,并且 volatile 也不适用于浮点数,因为它们是在 FPU 管道中处理的,而不是在 CPU 中处理的。总而言之,易失性并不是很有用,但微软的编译器会自动在易失性周围放置指令保护,使它们成为真正的原子值,但这不是标准的一部分。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

C99 中的易失性语义 的相关文章

随机推荐