考虑这两个定义:
volatile int a[10];
volatile int *p = a;
如果我们提到
a[3]
,则该内存位置被视为volatile
存储。在 C 中,p[3]
是否也指 volatile
存储,尽管它被声明为指针而不是数组?
与流行的看法相反,声明
volatile int
不会产生任何易失性存储,它只是告诉编译器将其视为如此。
volatile
不适用于 x86 以外的多线程问题,因为其他处理器的内存模型较弱,并且编译器不会发出必要的指令。 volatile
只告诉编译器不要优化变量访问,不要发出内存屏障。
将会发生的情况是,对
a
的任何访问或通过 p
无论其指向何处的任何访问都不会被优化掉。就是这样,不多也不少。
实际的易失性存储器是这样声明的:
extern volatile int trisa;
并且定义是由无法用标准c编写的目标文件提供的。 volatile
是 for 内存映射 IO。它还有其他目的,但这就是它被创建的原因。当 setjmp()
中的规范引用 volatile
时,它知道编译器不知道的东西; setjmp()
会破坏调用保留的寄存器,因此将本地变量视为易失性内存可以正常工作。