9

你能举一个简单的或真实的例子来演示 volatile 复制构造函数的用法吗?

我就是想不出一个。

4

1 回答 1

8

正如@Nawaz 已经指出的那样:

当你有 volatile 对象时,你需要 volatile copy-ctor。所以问题归结为:什么时候需要 volatile 对象?

使用 volatile 关键字的主要原因通常是禁用优化。也就是说,如果你有这样的东西:

bool flag = false;
if(!flag) {}

编译器将看到标志无法更改,因此无需每次都检查标志 - 所以不会。但是,如果您使标志变量 volatile - 它会。

以下是对 volatile 关键字原始使用的看法:link

简而言之,它最初是用来通过MMIO访问硬件的,这可能有点不寻常:

unsigned char* pControl = 0xff24 ;
*pControl = 0 ;
*pControl = 0 ;
*pControl = 0 ;

而且您不希望这 3 个任务由于优化而成为一个。

这是 Andrei Alexandrescu 关于多线程软件中易失性的论文:链接

有一些论文批评亚历山德雷斯库的论文,但我找不到。关键是他正在抛弃不稳定的财产等等。

请注意@JanHudec 指出的关于多线程的非常重要的事情:

volatile对于多线程上下文完全没用,因为虽然它阻止了优化,但它不会产生显式障碍。如果没有在一个 CPU 上完成的写入,另一个 CPU 可能无法看到(取决于架构;x86 具有连贯的缓存,因此写入总是在那里可见)。

也不volatile强制操作是原子的。在 x86 上分配始终是原子的,但并非所有 CPU 架构都是如此。而像增量这样更复杂的操作只能使用std::atomic.

于 2013-10-09T06:27:34.080 回答