【问题标题】:Where are volatile variables stored? [duplicate]易失性变量存储在哪里? [复制]
【发布时间】:2013-07-27 20:24:37
【问题描述】:

我能知道volatile 变量在内存中的存储位置吗?

  1. 如果我全局声明意味着它存储在内存中的什么位置?

    volatile int a =10;
    int main()
    {
        printf("Global A value=%d",a);
        return 0;
    }
    
  2. 如果我在函数中本地声明意味着它存储在内存中的什么位置?

    int main()
    {
        volatile int a =10;
        printf("Local A value=%d",a);
        return 0;
    }
    

它是否存储在堆栈/RAM/数据段中?

请澄清我的疑问。

【问题讨论】:

  • 您在寻找什么样的答案? “它在哪里存储在内存中”是什么意思?你想知道它的地址吗?您是否试图根据标准对此类池的定义来了解此类变量来自哪个内存池?
  • @NicolBolas:我猜问题的一部分是“使用volatile 限定变量是否会改变编译器放置变量的内存位置”,答案是否定的。
  • 我看不出这是另一个的副本。另一个是关于“volatile是什么”,这个是“关于内存地址有什么结果”。
  • @JonathanLeffler:在我的第一个示例中,我知道全局初始化变量(没有 volatile)存储在“初始化数据段”和我的第二个示例中,因为它是局部变量(没有 volatile)它得到存储在堆栈中。所以当我添加 volatile 关键字时,变量存储位置是否会改变?...请澄清我的疑问

标签: c++ c


【解决方案1】:

volatile 只是告诉编译器它不能在寄存器中缓存变量的值——它不会改变分配的位置。

【讨论】:

  • 有时它还有助于防止编译器优化过程中的一些缺点,例如从整个程序中省略 var。基本上编译器会考虑var,即使它没有在整个程序中使用,所以它不会删除它。
【解决方案2】:

volatile 限定符添加到变量声明不会更改其存储类。

在您的第一个示例中,变量具有静态存储,而在第二个示例中,它具有自动存储;即使您删除 volatile 限定符也是如此。

【讨论】:

  • 大家好,感谢您的回复。
  • 大家好,在我的第一个示例中,我知道全局初始化变量(没有 volatile)存储在“初始化数据段”和我的第二个示例中,因为它是局部变量(没有 volatile)它得到存储在 stack.so 当我添加 volatile 关键字意味着变量位置是否会改变?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-11-03
  • 2011-12-12
  • 2017-06-10
  • 1970-01-01
  • 2018-08-14
  • 2017-03-26
  • 2010-10-02
相关资源
最近更新 更多