volatile和pointer变量都从地址中获取值而不是优化,因此有什么明显区别。
答案 0 :(得分:6)
volatile
是一个存储类,还有register
,static
,external
。 volatile
表示除了正在运行的程序之外,其他力可以改变volatile变量的值,因此编译器必须小心不要在每次使用时优化获取变量的新副本。
指针包含内存位置的地址。要访问它指向的内容,必须取消引用它。
答案 1 :(得分:0)
Volatile指示编译器从存储器位置重新获取值,而不是使用存储在寄存器中的值。这是因为存储器位置可能已被更新(例如,通过其他线程)。这就是
的含义从地址
中获取值
不作为指针。你也可以使用一个非指针变量,例如原始。
因此,重新获取int变量,而不是在寄存器中使用存储的值
它还强制执行某些与读/写相关的语义(但这与您的OP无关)
答案 2 :(得分:0)
Volatile
是一个存储类,它告诉编译器每次访问时都从内存中获取值,并在每次写入时写入内存。当程序以外的某些实体也可能更改某个地址的值时,通常会使用它。
编译器以多种方式优化程序。例如,如果您有以下代码:
int *ptr=0x12345678;
int a;
*ptr=0x10;
a=*ptr;
然后编译器可以将语句a=*ptr;
优化为a=0x10;
以避免内存访问。理由是因为你刚写了0x10; to * ptr所以当你读* ptr时你会得到0x10。
在正常情况下,这种假设是正确的,但考虑到地址0x12345678是嵌入式系统UART的某个存储器映射寄存器的地址并向其写入0x10告诉它从连接的控制台读取字符的情况。然后将读取的字符写回地址0x12345678,以便用户可以从那里获取它。现在在这种情况下,上述优化将导致问题。因此,您需要告诉编译器每次访问时都要读取/写入指针的值,而不是优化对它的访问。所以你声明指针ptr volatile告诉编译器不要优化对它的访问。
volatile int *ptr=0x12345678;
答案 3 :(得分:0)
Volatile:一个类型说明符,它告诉编译器从它的内存位置访问变量(即使程序没有改变值,也不要放入寄存器以便快速访问),因为一个 volatile 变量的值是可以改变的从程序外部(例如微控制器中的 IO 端口)或从 ISR。
指针:指针变量用于保存变量的地址。
易失性指针:告诉编译器仅从其位置读取指针指向的值(例如微控制器中的 GPIO 指针)。