我有下面這個簡單的程序,我正在使用它來刷新我對GDB的記憶(我多年沒有碰過它)。GCC變化小於或等於
#include <stdio.h>
int main()
{
int i;
for (i = 0; i < 10; i++)
{
printf("Hello World\n");
}
return 0;
}
我編譯這個與gcc -g for-test.c -o for-test
。根據手冊頁,我不期望使用任何優化,因爲我沒有指定任何優化。
當我這個裝入GDB和運行disassemble main
,該i < 10
比較產生如下:
cmp DWORD PTR [rbp-0x4],0x9
jle 0x4004fe <main+10>
這似乎已有效改變了i < 10
一個比較i <= 9
。鑑於這些是整數比較,不應該有差異,但我想知道GCC是否有任何理由輸出這個程序集,而不是比較10和跳躍,如果小於(JL)?
編輯:這是在一臺裝有64位處理器的機器上運行Ubuntu的GCC 4.6.3和GDB 7.4-2012.04。
兩種方式100%相同(每個CPU上的行爲相同,代碼大小相同,速度相同)。我不知道GCC的內部結構,所以我猜不出它爲什麼這樣做。更有趣的是,我認爲你沒有啓用優化(否則它會使用寄存器而不是'i'的局部變量)。 – Brendan
也許這就是它如何規範化比較.. – harold
如果有兩個不一樣的機會,它不會沒有優化。例如'如果(a + 1> 1)'通過優化被簡化爲'if(a> 0)',但它可能是不安全的,所以不會這樣做。 – teppic