C ++为什么存在“const volatile”类型限定符?

时间:2015-11-13 02:07:36

标签: c++ const volatile

说我有一些对象声明为const volatile

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

  

[..] volatile是一个提示,以避免攻击性   涉及对象的优化因为对象的值   可能会被实施无法检测到。[...]

但是,const限定符暗示对象 可能会发生变化,因此两个限定符似乎发生冲突:

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

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

2 个答案:

答案 0 :(得分:3)

如果你定义

const some_type x = some_value;

这意味着您无法修改x的值。如果没有volatile,编译器可以将x的引用替换为some_value

如果你定义

const volatile some_type x = some_value;

然后你仍然无法修改x(至少不能使用名称x),但编译器不能再认为它的值不能改变。对x的值的任何引用都必须实际从内存中加载其值;它不能假设它将始终保持其初始值。

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

答案 1 :(得分:1)

这没有多大意义:

int const volatile x = 42;

你是对的,x无法更改 - 请删除volatile。但是,以下是不同的:

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

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