优化和执行顺序

优化和执行顺序

优化和执行顺序 #

假设我们有三个全局 int 变量 x、y 和 a,然后我们执行下面的代码:

x = a;
y = 2;

那是不是编译器会产生先写入 x、再写入 y 的代码呢?

我想你猜到了,答案为“不一定”。下面是某些编译器实际产生的汇编代码(参见 https://godbolt.org/z/zsfvsf63E%EF%BC%89%EF%BC%9A

mov     eax, DWORD PTR a
mov     DWORD PTR y, 2
mov     DWORD PTR x, eax

我们可以看到,编译器产生的代码是:先读入 a,再写入 y,最后写入 x。

为什么要这样?一样,是因为优化。读入 a 的数值到 eax 寄存器里,跟写入 2 到 y 里是两个不相关操作,可以同时执行。这样的代码,比起完全按程序员指定的执行顺序产生的代码,可望得到更高的性能。

Viewpoint #

From #