为什么一个指向volatile的指针,比如“volatile int * p”,有用?

volatile是告诉编译器不要优化引用,这样每个读/写操作都不使用存储在寄存器中的值,而是进行真正的内存访问。 我可以理解它对于一些普通的variables是有用的,但是不理解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; 

是一个指向编译器将被视为volatileint的指针。 这意味着编译器将假定即使源代码中没有任何内容表明可能发生这种情况, p所指向的variables也可能发生变化。 例如,如果我将p设置为指向一个常规整数,那么每次读取或写入*p ,编译器都会意识到该值可能已经意外更改。

对于一个volatile int*还有一个用例:如果将int声明为volatile ,那么不应该用int*指向它。 例如,这是一个坏主意:

 volatile int myVolatileInt; int* ptr = &myVolatileInt; // Bad idea! 

原因是C编译器不再记得ptr指向的variables是volatile ,因此它可能会错误地将*p的值caching在寄存器中。 实际上,在C ++中,上面的代码是错误的。 相反,你应该写

 volatile int myVolatileInt; volatile int* ptr = &myVolatileInt; // Much better! 

现在,编译器记得ptr指向一个volatile int ,所以它不会(或不应该)尝试优化通过*ptr访问。

最后一个细节 – 你讨论的指针是一个指向volatile int的指针。 你也可以这样做:

 int* volatile ptr; 

这表示指针本身volatile ,这意味着编译器不应该尝试caching指针到内存中,或者尝试优化指针值,因为指针本身可能会被别的东西(硬件,另一个线程等)重新分配。如果你想得到这个野兽,你可以把它们结合在一起:

 volatile int* volatile ptr; 

这表示指针和指针可能会意外改变。 编译器不能优化指针本身,也不能优化指针。

希望这可以帮助!

这段代码volatile int *p = some_addr声明一个指向volatile int的指针。 指针本身是volatile

在不太可能发生的情况下,您需要将指针变为volatile以及int,您将需要使用:

 volatile int * volatile p; 

我想不出你需要使用的情况。