另外,也有人说,volatile 意味着该值可以通过代码之外的手段进行更改。
我无法理解第二种说法。那么 volatile 变量可以由代码之外的手段更改吗?如何进行更改?这两个说法都正确吗?
语句“该变量可以被此代码之外的方式更改”基本上意味着另一个程序或硬件可以更新该变量。这是完全可能的。一个思考方式是将这个概念与多个程序共享的文件相关联。一个文件可以同时被多个程序打开、写入和读取。当您从文件中读取时,要确保读取的是最新的更新,而不是最老的。
回到“volatile”关键字,将“volatile”放在变量前面实际上是做同样的事情。它确保您从变量中读取的内容不是基于编译器的优化或程序拥有的旧副本。此外,“volatile”关键字确保每次访问时变量都从内存中获取。因此,这两个语句都正确描述了“volatile”关键字。
C语言不仅仅用于计算机。例如,如果你在开发Game Boy Advance游戏,你经常会遇到硬件修改的内存位置,所以 你可能不会在代码中修改变量 ,但它仍然被修改了。这就是 volatile
的意义。
通过添加 volatile
关键字,你告诉编译器 “这个变量(内存位置)存储的值可能会在没有我的代码干扰下发生改变。”
#include
,但这并不意味着它们没有用处。 - Oliver Charlesworth考虑以下任何一种情况:
在这些情况中,内存可能会在当前线程之外被更改。
请注意,“每当寄存器中变量的值发生更改时,则该值应影响内存”是正确的,只是不太清晰。
volatile
几乎没有什么用处。 - curiousguy一个内存位置可以通过多种方式在程序代码之外被改变。例如,从磁盘进行的DMA读取可以写入缓冲区,或者由于设备上的某些事件而导致内存映射设备更改位置。
例如,这涉及到多线程应用程序:一个变量的值可能会被多个线程改变,因此每次访问(无论是读取还是写入该值)都必须与内存“同步”。
声明一个volatile变量意味着您正在指示编译器不要优化该变量周围的代码片段。这是为了强制CPU不使用从本地寄存器或缓存内存中获取变量值,而是每次都从主内存中获取其值。