考虑一块的C++代码:为什么会产生这样奇怪的代码?
int main()
{
volatile int a=0;
if(!a)
++a;
}
予编译它AMD64系统上 克++(Ubuntu的4.8.1-2ubuntu1〜12.04)与命令g++ test.cpp -S -o test.S -masm=intel
并获得以下代码:
...
mov eax, DWORD PTR [ebp-4]
test eax, eax
sete al
test al, al
je .L2
mov eax, DWORD PTR [ebp-4] ; don't use result of sete
add eax, 1
mov DWORD PTR [ebp-4], eax
.L2:
mov eax, 0 ; also drop result of sete
...
这段代码真的让我感到惊讶。起初我认为它与64位模式有关。但是当我试图编译-m32
时,这一点保持不变。
为什么它检查eax
为零,然后在将al
设置为ZF
后再次检查结果?为什么它不只是test eax,eax\n jne .L2
?
打开优化(命令行上的-O3),无用的指令将消失。 –
@NilsPipenbrinck我知道优化。问题是关于为什么如此,而不是如何解决。 – Ruslan