Inf*_*ite 71 c pointers volatile
volatile是告诉编译器不要优化引用,这样每次读/写都不会使用存储在寄存器中的值,而是进行实际的内存访问.我可以理解它对一些普通变量有用,但不明白如何volatile影响指针.
volatile int *p = some_addr;
int a = *p; // CPU always has to load the address, then does a memory access anyway, right?
Run Code Online (Sandbox Code Playgroud)
如果它被宣布为有什么区别int *p = some_addr?
tem*_*def 132
表单的指针
volatile int* p;
Run Code Online (Sandbox Code Playgroud)
是指向int编译器将视为的指针volatile.这意味着p即使源代码中没有任何内容表明可能发生这种情况,编译器也会认为指向的变量可能已更改.例如,如果我设置p为指向常规整数,那么每次读取或写入*p编译器时都会意识到该值可能已意外更改.
还有一个用例volatile int*:如果你声明一个intas volatile,那么你不应该用常规指向它int*.例如,这是一个坏主意:
volatile int myVolatileInt;
int* ptr = &myVolatileInt; // Bad idea!
Run Code Online (Sandbox Code Playgroud)
原因是C编译器不再记得指向的变量ptr是volatile,因此它可能会*p错误地缓存寄存器中的值.实际上,在C++中,上面的代码是一个错误.相反,你应该写
volatile int myVolatileInt;
volatile int* ptr = &myVolatileInt; // Much better!
Run Code Online (Sandbox Code Playgroud)
现在,编译器会记住ptra处的点volatile int,因此它不会(或不应该!)尝试通过优化访问*ptr.
最后一个细节 - 你讨论的指针是指向a的指针volatile int.你也可以这样做:
int* volatile ptr;
Run Code Online (Sandbox Code Playgroud)
这表示指针本身就是volatile,这意味着编译器不应该尝试将指针缓存在内存中或尝试优化指针值,因为指针本身可能会被其他东西(硬件等)重新分配.您可以将这些结合起来如果你想得到这个野兽一起:
volatile int* volatile ptr;
Run Code Online (Sandbox Code Playgroud)
这说明指针和指针可能会意外地改变.编译器无法优化指针本身,也无法优化指向的内容.
希望这可以帮助!
此代码volatile int *p = some_addr声明了一个指向a的指针volatile int.指针本身不是volatile.
在极少数情况下你需要指针是volatile和int,你需要使用:
volatile int * volatile p;
Run Code Online (Sandbox Code Playgroud)
我想不出你需要使用它的情况.