好的,因此出于性能原因,编译器可以自由地重新排序代码片段。让我们假设一些代码片段,直接翻译成没有应用优化的机器代码,如下所示:
machine_instruction_1
machine_instruction_2
machine_instruction_3
machine_instruction_4
machine_instruction_5
但是智能编译器认为原始顺序非常低效并重新排序相同的代码,以便生成的机器指令的新顺序如下:
machine_instruction_5
machine_instruction_4
machine_instruction_3
machine_instruction_2
machine_instruction_1
到目前为止,一切都很好。
这是棘手的部分开始的地方。生成的机器指令将由 cpu 执行,只要保留代码逻辑,cpu 就可以以任何它认为适合性能的方式自由地重新洗牌它们。由于我们正在处理指令重新排序的两个“层”:
- 第一个,由于编译器优化
- 第二个,由于cpu乱序执行
是什么使编译时指令重新排序完全相关?cpu 看到的只是一系列原始机器指令,没有迹象表明编译器执行了任何先前的优化。如果 cpu 引入了自己的重新排序“层”,为什么它不会使编译器设置的指令顺序无效?基本上,是什么迫使 cpu 尊重编译器优化?编译时重排序和运行时重排序如何“合作”,后者如何补充前者?