C语言 为什么像“volatile int * p”这样的指向volatile的指针有用?

0ejtzxu1  于 2022-12-26  发布在  其他
关注(0)|答案(3)|浏览(188)

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,有什么区别?

5t7ly7z5

5t7ly7z51#

形式为的指针

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;

这意味着指针和被指针对象都可能发生意外的改变,编译器不能优化指针本身,也不能优化被指向的对象。

1tuwyuhd

1tuwyuhd2#

这段代码volatile int *p = some_addr声明了一个指向volatile int的指针。指针本身不是volatile
在不太可能的情况下,您需要指针和int一样是volatile,您需要用途:

volatile int * volatile p;

我想不出有什么情况你需要用这个。

vfwfrxfs

vfwfrxfs3#

关于volatile的有用性:如果你需要检查内存,这是必要的,它是由硬件修改,如串行接口控制器。它有它的应用在嵌入式系统的世界,在那里你工作非常接近硬件,没有任何操作系统之间。

相关问题