考慮一塊的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