关于优化代码中的代码执行保证,我一直在阅读关于SO的一些问题,所以我试图编译一个原因列表,说明允许/阻止编译器重新排序代码序列的原因.
我已经开始回答一般情况但是我没有添加标准的引用(这取自我的经验).如果有任何遗忘或扩展/纠正在那里的点,我会要求你添加答案.
此外,如果代码块不需要重新排序,有人可以验证我.即
void fn()
{
{ /* code block 1 */ ... }
{ /* code block 2 */ ... }
}
Run Code Online (Sandbox Code Playgroud)
是否有可能在代码中code block 1,以混合或者被执行之前到code block 2?
该标准为编译器提供了很多余地,可以重新排序代码并进行各种其他优化.对优化器唯一真正的约束是执行代码的可观察结果应该"好像"代码是按程序员编写的顺序执行的.只要遵循"似乎"规则,编译器/链接器/ CPU /内存子系统就可以自由地重新排序他们喜欢的任何内容.变量上的volatile修饰符限制了重新排序(或删除)对该变量的读取和写入的机会,因为它告诉编译器它不能对从一个读取或写入到另一个的变量的状态做出任何假设,但它通常不会影响同一段代码中对其他非易失性变量的读写.
C++ 11标准增加了额外的语言,明确说明在多线程世界中存在哪些保证,其中事情有点复杂.在这里,该标准保证了数据竞争免费程序的顺序一致性.如果程序员使用正确的同步并且不写任何数据争用,这实际上是'似乎'规则.如果您的代码有数据竞争,那么您可能能够观察到如果代码是按照您执行多个同时执行的线程时编写的顺序执行的,则无法实现的结果.C++ 11原子和内存屏障提供了向编译器表达额外约束的方法,即在存在多个同时执行的线程的情况下可以安全地执行哪种重新排序.