volatile
是告诉编译器不要优化引用,这样每次读/写都不会使用寄存器中存储的值,而是真正的内存访问。我能理解它对一些普通变量很有用,但不明白 volatile
如何影响指针。
volatile int *p = some_addr;
int a = *p; // CPU always has to load the address, then does a memory access anyway, right?
如果声明为 int *p = some_addr
有什么区别?
最佳答案
窗体指针
volatile int* p;
是一个指向 int
的指针,编译器会将其视为 volatile
。这意味着编译器将假定 p
指向的变量可能已更改,即使源代码中没有任何内容表明这可能发生。例如,如果我将 p
设置为指向一个常规整数,那么每次我读取或写入 *p
时,编译器都会意识到该值可能已意外更改。
volatile int*
还有一个用例:如果您将 int
声明为 volatile
,那么您不应该指向它带有一个常规的 int*
。例如,这是一个坏主意:
volatile int myVolatileInt;
int* ptr = &myVolatileInt; // Bad idea!
原因是 C 编译器不再记住 ptr
指向的变量是 volatile
,所以它可能会缓存 * 的值寄存器中的 ptr
错误。其实在C++中,上面的代码是错误的。相反,你应该写:
volatile int myVolatileInt;
volatile int* ptr = &myVolatileInt; // Much better!
现在,编译器记住 ptr
指向一个 volatile int
,因此它不会(或不应该!)尝试优化通过 的访问*ptr
.
最后一个细节 - 您讨论的指针是指向 volatile int
的指针。您也可以这样做:
int* volatile ptr;
这表示指针本身是volatile
,这意味着编译器不应该尝试将指针缓存在内存中或尝试优化指针值,因为指针本身可能会被其他东西(硬件等)重新分配。如果你想得到这个野兽,你可以将它们组合在一起:
volatile int* volatile ptr;
这表示指针和指针对象都可能发生意外更改。编译器无法优化指针本身,也无法优化所指向的内容。
关于c - 为什么像 "volatile int * p"这样的指向 volatile 的指针有用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9935190/