1
2
编译器可以自由地优化代码
因为
该标准只要求编译器严格遵守易失性对象的语义。下面是C++ 03所说的
和
在您的示例中,使用易失性lvalue对非易失性对象进行读写。C++ 0x删除了上面引用的第二个文本,因为它是多余的。c++只是说
虽然有人会说“易失性数据”可能意味着“由易失性LValk访问的数据”,这仍然是一个相当大的扩展,C++0X措辞消除了您对代码的所有疑虑,并清楚地允许实现优化它。
但正如人们向我指出的,这在实践中可能并不重要。优化这样一个东西的编译器很可能违背程序员的意图(为什么有人会有一个指向volatile的指针,否则),因此可能包含一个bug。不过,我还是有经验的编译器供应商在遇到关于他们过度激进优化的错误报告时引用了这些段落。最后,
|
2
3
从最后的C++0X草案[介绍执行]:
因此,即使您提供的代码也不能优化。 |
3
1
您希望删除的内存内容可能已经从CPU/内核的内部高速缓存中刷新到RAM,其他CPU可以继续看到它。覆盖之后,您需要使用互斥/内存屏障指令/原子操作或其他东西来触发与其他核心的同步。实际上,编译器在调用任何外部函数(Google Dave Butenhof关于volatile在多线程中的可疑实用程序的文章)之前可能会这样做,因此,如果稍后线程就这么做了,那么这不是主要问题。总之:不需要挥发性。 |
4
1
一致性实现可以在空闲时推迟任何可变读写的实际性能,直到可变读的结果会影响可变写操作或I/O操作的执行。 例如,假设如下:
一致性编译器可以根据自己的选择检查
|
Fredericson · 如何避免在Java中使用volatile 6 年前 |
razorozx · C++如何获取父数据类型的sizeof? 7 年前 |
JavaKaKida · 单核cpu java中的易失性 7 年前 |
gstackoverflow · 顺序一致性挥发性解释 7 年前 |
AlastairG · volatile关键字如何影响静态常量数组? 7 年前 |