你能给出一个简单或真实的例子来演示volatile复制构造函数的用法吗?
我无法想出一个。
答案 0 :(得分:8)
正如@Nawaz已经指出的那样:
如果有易失物体,则需要使用易失性复制器。所以问题归结为:你什么时候需要易变物?
使用volatile关键字的主要原因通常是禁用优化。那就是你有这样的东西:
bool flag = false;
if(!flag) {}
编译器会看到该标志无法更改,因此不需要每次都检查标志 - 所以它不会。但是如果你使标志变量挥发 - 它会。
以下是易失性关键字原始用法的意见:link
简而言之,它最初用于通过MMIO访问硬件,这可能有点不寻常:
unsigned char* pControl = 0xff24 ;
*pControl = 0 ;
*pControl = 0 ;
*pControl = 0 ;
由于优化,你不希望这3个作业成为一个。
以下是Andrei Alexandrescu关于多线程软件易变性的论文:link
有些论文批评亚历山大夫斯库的论文,但我找不到。关键在于他正在抛弃挥发性财产等等。
请注意@JanHudec指出的多线程非常重要的事情:
volatile
对于多线程上下文完全没用,因为虽然它阻止了优化,但它不会产生明显的障碍。如果没有那些在一个CPU上完成的写操作可能不会被另一个CPU看到(取决于架构; x86具有连贯的高速缓存,因此写入总是在那里可见)。同样
volatile
不强制操作是原子的。在x86上,赋值总是原子的,但并非所有CPU体系结构都是如此。而增量等更复杂的操作只能使用std::atomic
原子化。