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,有什么区别?
int *p = some_addr
5t7ly7z51#
形式为的指针
volatile int* p;
是一个指向int的指针,编译器会将其视为volatile。这意味着编译器会假设p所指向的变量可能已经更改,即使源代码中没有任何内容表明可能发生更改。例如,如果我将p设置为指向一个常规整数,那么每次我读或写*p时,编译器就会意识到这个值可能已经意外地改变了。volatile int*还有一个用例:如果您将int声明为volatile,则不应使用常规int*指向它。例如,这是一个坏主意:
int
p
*p
volatile int*
int*
volatile int myVolatileInt; int* ptr = &myVolatileInt; // Bad idea!
这是因为C编译器不再记得ptr所指向的变量是volatile,所以它可能会错误地将*ptr的值缓存到寄存器中。实际上,在C++中,上面的代码是一个错误。相反,您应该编写:
ptr
*ptr
volatile int myVolatileInt; volatile int* ptr = &myVolatileInt; // Much better!
现在,编译器记住ptr指向volatile int,所以它不会(或者不应该!)尝试优化通过*ptr的访问。最后一个细节-您讨论的指针是指向volatile int的指针。您还可以这样做:
volatile int
int* volatile ptr;
这意味着指针 * 本身 * 是volatile,这意味着编译器不应该尝试在内存中缓存指针或尝试优化指针值,因为指针本身可能会被其他东西(硬件等)重新分配。如果你想得到这个怪物,你可以把它们组合在一起:
volatile int* volatile ptr;
这意味着指针和被指针对象都可能发生意外的改变,编译器不能优化指针本身,也不能优化被指向的对象。
1tuwyuhd2#
这段代码volatile int *p = some_addr声明了一个指向volatile int的指针。指针本身不是volatile。在不太可能的情况下,您需要指针和int一样是volatile,您需要用途:
volatile int *p = some_addr
volatile int * volatile p;
我想不出有什么情况你需要用这个。
vfwfrxfs3#
关于volatile的有用性:如果你需要检查内存,这是必要的,它是由硬件修改,如串行接口控制器。它有它的应用在嵌入式系统的世界,在那里你工作非常接近硬件,没有任何操作系统之间。
3条答案
按热度按时间5t7ly7z51#
形式为的指针
是一个指向
int
的指针,编译器会将其视为volatile
。这意味着编译器会假设p
所指向的变量可能已经更改,即使源代码中没有任何内容表明可能发生更改。例如,如果我将p
设置为指向一个常规整数,那么每次我读或写*p
时,编译器就会意识到这个值可能已经意外地改变了。volatile int*
还有一个用例:如果您将int
声明为volatile
,则不应使用常规int*
指向它。例如,这是一个坏主意:这是因为C编译器不再记得
ptr
所指向的变量是volatile
,所以它可能会错误地将*ptr
的值缓存到寄存器中。实际上,在C++中,上面的代码是一个错误。相反,您应该编写:现在,编译器记住
ptr
指向volatile int
,所以它不会(或者不应该!)尝试优化通过*ptr
的访问。最后一个细节-您讨论的指针是指向
volatile int
的指针。您还可以这样做:这意味着指针 * 本身 * 是
volatile
,这意味着编译器不应该尝试在内存中缓存指针或尝试优化指针值,因为指针本身可能会被其他东西(硬件等)重新分配。如果你想得到这个怪物,你可以把它们组合在一起:这意味着指针和被指针对象都可能发生意外的改变,编译器不能优化指针本身,也不能优化被指向的对象。
1tuwyuhd2#
这段代码
volatile int *p = some_addr
声明了一个指向volatile int
的指针。指针本身不是volatile
。在不太可能的情况下,您需要指针和int一样是volatile,您需要用途:
我想不出有什么情况你需要用这个。
vfwfrxfs3#
关于volatile的有用性:如果你需要检查内存,这是必要的,它是由硬件修改,如串行接口控制器。它有它的应用在嵌入式系统的世界,在那里你工作非常接近硬件,没有任何操作系统之间。