易变量

时间:2009-11-03 05:39:38

标签: c multithreading memory volatile

存储在程序存储器中的易失性变量在哪里(在哪部分)?

6 个答案:

答案 0 :(得分:21)

volatiletype qualifier而非storage class specifier,因此根本不确定存储位置;它会影响变量类型的定义,而不会影响其存储。

它只是强制编译器从变量的存储位置(无论在哪里)显式读取 type volatile的变量,而不是假设寄存器中的某些先前读取的值例如仍然有效。

答案 1 :(得分:10)

在C volatile中只告诉编译器 - “你没有足够的知识来假设这个变量的值没有改变”。没有“部分”,例如BSS,CSS。

将其视为编译器的标志,以防止某些类型的优化。它在嵌入式编程中非常方便,其中某个地址的内存可能会因硬件设备输入而“改变”。

以下是一个很好的解释:http://www.embedded.com/columns/programmingpointers/174300478?_requestid=137658

答案 2 :(得分:7)

变量的波动性不会改变存储变量的位置。它改变的是关于如何访问读取和写入的语义。

我不相信C标准说明了volatile的实现。但通常,volatile保证释放对变量的写操作的语义和对变量的读操作的获取语义。但是对于每个实现都不是这样,您应该阅读特定编译器保证的内容

答案 3 :(得分:4)

volatile没有什么可以处理存储类。

volatile只告诉编译器或强制编译器“不对该变量进行优化”。 所以编译器不会优化该变量的代码并从指定位置读取值,而不是通过保存前一个值的interal寄存器。

因此,通过将变量声明为volatile ...它会为封锁者提供最新的值,这可能会被外部事件所改变。

如果没有将该变量声明为volatile,那么您的代码可能正常工作,但有时可能无法获得正确的值。 所以为了避免我们应该将变量声明为volatile。

volatile通常在处理外部事件时使用,例如硬件相关引脚的中断。

例子。 阅读adc值。

const voltile意味着 您无法在代码中修改或更改该变量的值。只有外部事件才能改变价值。

控制器引脚通常定义为volatile。 可能是通过声明变量,因为易失性控制器将执行“通过引脚读取”而不是“通过锁存器读取”...这是我的假设。可能是错的......

但是当选择变量为volatile时仍然存在很多困惑。

变量应该在其值可能意外更改时声明为volatile。实际上,只有三种类型的变量可以改变:

  1. 内存映射外设寄存器

  2. 由中断服务程序修改的全局变量

  3. 多线程应用程序中的全局变量

  4. 链接:http://eetimes.com/discussion/beginner-s-corner/4023801/Introduction-to-the-Volatile-Keyword

    因此,在这种情况下,变量是易变的。

答案 4 :(得分:2)

没有理由将volatile变量存储在内存的任何“特殊”部分中。它通常与任何其他变量一起存储,包括非易失变量。如果某些编译器决定将volatile变量存储在内存的某个特殊部分中 - 没有什么可以阻止它这样做。但在语言层面上,绝对没有理由这样做。

你为什么问这样的问题?是什么让你认为应该存储在内存的某个特殊部分?

答案 5 :(得分:2)

“Volatile”在C / C ++规范中用于允许使用内存映射设备。它指示编译器不要优化用this关键字定义的变量,只是因为变量似乎没有在编译器可见代码中改变它的状态。