C语言中的'volatile'保留字[重复]

0md85ypi  于 2022-12-03  发布在  其他
关注(0)|答案(6)|浏览(121)

此问题在此处已有答案

Why is volatile needed in C?(18个答案)
八年前就关门了。
我读了一些C语言中关于volatile的教程,但是我还是搞不懂它。有人说 volatile 告诉编译器优化器,涉及这个变量的操作不应该以某些方式优化。这意味着任何时候一个变量的值在寄存器中被改变,那么这个值应该影响内存。
也有人说 volatile 意味着值可以通过代码之外的方式更改。
我不明白第二个说法。所以volatile变量可以通过代码之外的方式改变?怎么做?这两个语句都对吗?

qfe3c7zg

qfe3c7zg1#

语句“该值可以通过此代码之外的方法来更改”基本上意味着另一个程序或硬件可以更新该变量。这是完全可能的。一种思考方法是将此概念与多个程序共享的文件联系起来。文件可以被打开、写入并且同时被许多程序读取。当您读取文件时,您希望确保您正在阅读最新的更新而不是最旧的更新。
回到volatile关键字,将volatile放在一个变量之前,实际上也起到了同样的作用。它确保了你从变量中阅读的内容不是基于编译器的优化或者你的程序所拥有的变量的旧副本。此外,volatile关键字确保了每次访问时都从内存中读取变量。因此,关于volatile关键字,这两个语句都是正确的。

mbzjlibv

mbzjlibv2#

C语言并不一定适用于计算机。例如,如果你正在开发Game Boy Advance,你经常会遇到被硬件修改的内存位置,所以 * 你可能不会修改代码中的变量 *,但它还是会被修改。这就是volatile的意思。
通过添加volatile关键字,您可以告诉编译器 “存储在此变量(内存位置)中的值可能会更改,而我的代码不会做任何事情。"

v8wbuo2f

v8wbuo2f3#

请考虑以下任一情况:

  • 多线程应用程序,
  • 使用共享存储器的应用程序,
  • 在将I/O寄存器Map到地址空间的平台上运行的应用程序,
  • 在后台进行硬件DMA的应用程序。

在上述每种情况下,都可以在当前线程之外更改内存。
注意,“* 任何时候一个变量的值在寄存器中被改变,那么这个值就应该影响内存 *”是正确的,只是不是很清楚。

c2e8gylq

c2e8gylq4#

内存位置可以在程序代码之外以多种方式改变。例如,从磁盘读取的DMA可以写入缓冲区,或者内存Map设备可以由于设备上的某个事件而改变位置。

0ve6wy6x

0ve6wy6x5#

例如,这可满足多线程应用的需求:变量的值可以由多个线程更改,因此每次访问时都必须与内存“同步”(无论是阅读还是写入该值)。

eagi6jfj

eagi6jfj6#

声明一个volatile变量意味着,你指示编译器不要优化这个变量的代码片段。这是为了迫使CPU * 不 * 使用本地寄存器或缓存中的变量值,而是每次都从主内存中获取值。

相关问题