C++ 为什么存在 "const volatile" 类型限定符?
C++ Why does the "const volatile" type qualifier exist?
假设我有一些对象声明为 const volatile
:
根据 C++ 标准 ($7.1.5.1/8):
[..] volatile is a hint to the implementation to avoid aggressive
optimization involving the object because the value of the object
might be changed by means undetectable by an implementation.[...]
然而,const
限定词暗示对象是而不是,因此这两个限定词似乎冲突:
一个暗示应该区别对待对象,因为它可能会发生变化,另一个暗示应该区别对待它,因为它不会发生变化。
那么,为什么首先允许变量是 const volatile
?
这没有多大意义:
int const volatile x = 42;
你说得对,x
无法更改 — 删除 volatile
。但是,以下是不同的:
int x = 42;
int const volatile& y = x;
现在无法更改 y
,但 x
可以,并且其更改会传播到 y
。当然,这与 volatile
无关 — 但如果对 y
的更改来自 C++ 编译器无法观察到的来源,则可能需要 volatile
。当然,在 volatile
有意义的情况下,pointer/reference 不仅仅指任何其他变量,而是指映射到硬件或其他地方的特定内存地址。
如果你定义
const some_type x = some_value;
也就是说你不能修改x
的值。在没有 volatile
的情况下,编译器可以用 some_value
.
替换对 x
的引用
如果你定义
const volatile some_type x = some_value;
那么你仍然不能修改x
(至少不能通过使用名称x
),但是编译器不能再假设它的值不能改变。对 x
值的任何引用都必须实际从内存中加载它的值;它不能假设它将始终保留其初始值。
例如,可能有一些特定于编译器的属性将 x
与某些设备相关联。名称 x
提供对象的只读视图; volatile
禁止某些优化。
假设我有一些对象声明为 const volatile
:
根据 C++ 标准 ($7.1.5.1/8):
[..] volatile is a hint to the implementation to avoid aggressive optimization involving the object because the value of the object might be changed by means undetectable by an implementation.[...]
然而,const
限定词暗示对象是而不是,因此这两个限定词似乎冲突:
一个暗示应该区别对待对象,因为它可能会发生变化,另一个暗示应该区别对待它,因为它不会发生变化。
那么,为什么首先允许变量是 const volatile
?
这没有多大意义:
int const volatile x = 42;
你说得对,x
无法更改 — 删除 volatile
。但是,以下是不同的:
int x = 42;
int const volatile& y = x;
现在无法更改 y
,但 x
可以,并且其更改会传播到 y
。当然,这与 volatile
无关 — 但如果对 y
的更改来自 C++ 编译器无法观察到的来源,则可能需要 volatile
。当然,在 volatile
有意义的情况下,pointer/reference 不仅仅指任何其他变量,而是指映射到硬件或其他地方的特定内存地址。
如果你定义
const some_type x = some_value;
也就是说你不能修改x
的值。在没有 volatile
的情况下,编译器可以用 some_value
.
x
的引用
如果你定义
const volatile some_type x = some_value;
那么你仍然不能修改x
(至少不能通过使用名称x
),但是编译器不能再假设它的值不能改变。对 x
值的任何引用都必须实际从内存中加载它的值;它不能假设它将始终保留其初始值。
例如,可能有一些特定于编译器的属性将 x
与某些设备相关联。名称 x
提供对象的只读视图; volatile
禁止某些优化。