我有以下简单的程序,我正在使用它来刷新我对GDB的记忆(我多年没有触及过)。
#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。
答案 0 :(得分:5)
执行速度不应该有差异。我认为gcc通常会为这种比较发出jle,并在生成的程序集中保持一致性。
答案 1 :(得分:2)
只要可观察行为相同,就允许编译器执行优化。这称为 As-If rule 。由于两种情况的可观察行为相同,因此允许编译器在两者中的任何一个中生成汇编代码。即使您没有启用任何优化,也是如此。
答案 2 :(得分:0)
这不是有效的优化,只是另一种写入相同的方式。使用-O标志进行编译会生成更复杂的优化。