ZHCADC5A June 2013 – June 2020
易失性位字段是用 C volatile 关键字声明的字段。当读取易失性位字段时,必须使用其整个容器的适当访问权限仅读取一次它的容器。
当写入自身大小小于其容器的易失性位字段时,必须使用适当的访问,仅读取一次和写入一次它的容器。读取和写入不需要彼此是原子形式。
当写入自身大小完全等于容器大小的易失性位字段时,未规定是否进行读取。由于未规定这类读取,因此对于采用不同实现方式编译的目标文件,如果二者都写入与自身容器宽度完全相同的易失性位字段,则将这些目标文件互连是不安全的。因此,应避免在外部接口中使用易失性位字段。
不能将对同一易失性位字段或同一容器内附加易失性位字段的多次访问合并。例如,增加一个易失性位字段时,必须始终实现为两次读取和一次写入。即使位字段的宽度和对齐允许使用较窄类型进行更高效的访问,这些规则也适用。对于写入操作,即使容器的全部内容将被替换,也必须进行读取。如果两个易失性位字段的容器重叠,则对其中一个位字段的访问也将导致对另一个位字段的访问。
例如,给定以下结构:
struct S
{
volatile int a:8; // container is 32 bits at offset 0
volatile char b:2 // container is 8 bits at offset 8
};
对“a”的访问也会导致对“b”的访问,但反之不适用。如果非易失性位字段的容器与易失性位字段重叠,则未定义对非易失性字段的访问是否会导致访问易失性字段。