指向 volatile 的 C 指针在有下标时是否指的是易失性内存?

问题描述 投票:0回答:1

考虑这两个定义:

volatile int a[10];
volatile int *p = a; 

如果我们提到

a[3]
,则该内存位置被视为
volatile
存储。在 C 中,
p[3]
是否也指
volatile
存储,尽管它被声明为指针而不是数组?

c volatile
1个回答
0
投票

与流行的看法相反,声明

volatile int
不会产生任何易失性存储,它只是告诉编译器将其视为如此。

volatile
不适用于 x86 以外的多线程问题,因为其他处理器的内存模型较弱,并且编译器不会发出必要的指令。
volatile
只告诉编译器不要优化变量访问,不要发出内存屏障。

将会发生的情况是,对

a
的任何访问或通过
p
无论其指向何处的任何访问都不会被优化掉。就是这样,不多也不少。

实际的易失性存储器是这样声明的:

extern volatile int trisa;
并且定义是由无法用标准c编写的目标文件提供的。
volatile
for 内存映射 IO。它还有其他目的,但这就是它被创建的原因。当
setjmp()
中的规范引用
volatile
时,它知道编译器不知道的东西;
setjmp()
会破坏调用保留的寄存器,因此将本地变量视为易失性内存可以正常工作。

© www.soinside.com 2019 - 2024. All rights reserved.