c - 为什么像 "volatile int * p"这样的指向 volatile 的指针有用?

标签 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?

如果声明为 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/

相关文章:

java - AtomicBoolean 与 volatile

调用 kfree 时崩溃(在内核模块内)

c - 我试图理解的字符串指针行为

c++ - 我的代码是什么原因?未处理的异常

java - 如何获取 ConcurrentHashMap 的最新 View ?

java - 通过 ReentrantLock 访问的字段是否需要 volatile 关键字?

c - void*,字符串和字符的指针

c - 使用 fork() 和 execlp 计算行数

c++ - 带有字符串和 int 参数的 fputc? "01234"[(int)tmp_seq[j][i]]

c - const 在这种情况下做什么 - const int *ptr;