【问题标题】:C++ Why does the "const volatile" type qualifier exist? [duplicate]C++ 为什么存在“const volatile”类型限定符? [复制]
【发布时间】:2016-02-14 13:37:00
【问题描述】:

假设我有一些对象声明为const volatile

根据 C++ 标准($7.1.5.1/8):

[..] volatile 是对实现避免激进的提示 涉及对象的优化因为对象的值 可能会通过实现无法检测到的方式进行更改。[...]

但是,const 限定符意味着对象 可以更改,因此这两个限定符似乎冲突:

一个意味着对象应该被区别对待,因为它可能会发生变化,另一个意味着它应该被区别对待,因为它会发生变化。

那么,为什么首先允许变量是const volatile

【问题讨论】:

  • 访问内存映射的只读硬件寄存器时可能有意义。
  • const 表示不能改变变量

标签: c++ constants volatile


【解决方案1】:

如果你定义

const some_type x = some_value;

这意味着您不能修改x 的值。在没有volatile 的情况下,编译器可以将x 的引用替换为some_value

如果你定义

const volatile some_type x = some_value;

那么你仍然不能修改x(至少不能使用名称x),但是编译器不能再假设它的值不能改变。对x 值的任何引用都必须实际从内存中加载其值;它不能假设它会一直保持它的初始值。

例如,可能有一些特定于编译器的属性将x 与某些设备相关联。名称x 提供对象的只读视图; volatile 禁止某些优化。

【讨论】:

    【解决方案2】:

    这没有多大意义:

    int const volatile x = 42;
    

    你说得对,x 无法更改 — 放弃 volatile。但是,以下情况有所不同:

    int x = 42;
    int const volatile& y = x;
    

    现在y 无法更改,但x 可以,并且其更改会传播到y。当然,不管volatile 是什么,这都有效——但是如果对y 的更改来自C++ 编译器无法观察到的源,则volatile 可能变得必要。当然,在volatile 有意义的情况下,指针/引用不仅仅引用任何其他变量,而是映射到硬件或其他地方的特定内存地址。

    【讨论】:

      猜你喜欢
      • 2018-11-01
      • 2016-06-09
      • 2010-10-01
      • 2012-12-28
      • 1970-01-01
      • 2015-03-13
      • 1970-01-01
      • 2020-06-09
      • 1970-01-01
      相关资源
      最近更新 更多