【发布时间】:2011-04-28 17:07:34
【问题描述】:
我有一个关于 C 语言中 volatile 的问题。
我阅读了一些教程但仍然无法弄清楚,有人说 volatile 告诉编译器优化器涉及此变量的操作不应该以某些方式进行优化。 这意味着只要变量的值在寄存器中发生变化,那么该值就会影响内存。
也有人说 volatile 意味着可以通过此代码之外的方式更改值。
第二个说法我看不懂,所以可以通过这段代码之外的方式改变 volatile 变量?如何?这两个说的都对吗?
【问题讨论】:
我有一个关于 C 语言中 volatile 的问题。
我阅读了一些教程但仍然无法弄清楚,有人说 volatile 告诉编译器优化器涉及此变量的操作不应该以某些方式进行优化。 这意味着只要变量的值在寄存器中发生变化,那么该值就会影响内存。
也有人说 volatile 意味着可以通过此代码之外的方式更改值。
第二个说法我看不懂,所以可以通过这段代码之外的方式改变 volatile 变量?如何?这两个说的都对吗?
【问题讨论】:
“可以通过此代码之外的方式更改值”的声明基本上意味着另一个程序或硬件可以更新该变量。这是完全可能的。一种思考方式是将此概念与在多个程序之间共享的文件相关联。一个文件可以同时被多个程序打开、写入和读取。当您从文件中读取时,您要确保您正在阅读最新的更新,而不是最旧的。
回到 volatile 关键字,将 volatile 放在变量之前,实际上是做同样的事情。它确保您从变量中读取的内容不是基于编译器的优化或程序拥有的变量的旧副本。此外, volatile 关键字确保每次访问时都从内存中获取变量。因此,关于 volatile 关键字,这两种说法都是正确的。
【讨论】:
C 不一定适用于计算机。例如,如果您正在为 Game Boy Advance 进行开发,您经常会遇到由硬件修改的内存位置,因此 您可能不会修改代码中的变量,但无论如何它都会被修改.这就是volatile 的意思。
通过添加volatile 关键字,您是在告诉编译器“存储在此变量(内存位置)中的值可能会在我的代码不做任何事情的情况下发生变化。” em>
【讨论】:
#includes。这并不意味着它们没有用。
考虑以下任何一项:
在每种情况下,都可以在当前线程之外更改内存。
注意“只要变量的值在寄存器中发生变化,那么该值就会影响内存”是正确的,只是不是很清楚。
【讨论】:
volatile 对多线程代码非常非常有用。
可以通过多种方式在程序代码之外更改内存位置。例如,从磁盘读取的 DMA 可以写入缓冲区,或者内存映射设备可以因为设备上的某些事件而更改位置。
【讨论】:
这适用于多线程应用程序:变量的值可以由多个线程更改,因此必须在每次访问时与内存“同步”(无论是读取还是写入值) .
【讨论】:
声明一个 volatile 变量意味着,您是在指示编译器不要围绕该变量优化代码 sn-p。这是为了强制 cpu 不使用本地寄存器或缓存内存中的变量值,而是每次都从主内存中获取值。
【讨论】: