什么是volatile复制构造函数?

时间:2013-10-09 05:48:26

标签: c++ copy-constructor

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

我无法想出一个。

1 个答案:

答案 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原子化。