【发布时间】:2013-03-30 11:28:27
【问题描述】:
我有以下简单的程序,我用它来刷新我对 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 位处理器的机器上,运行带有 GCC 4.6.3 和 GDB 7.4-2012.04 的 Ubuntu。
【问题讨论】:
-
两种方式 100% 相同(相同的行为、相同的代码大小、每个 CPU 的相同速度)。我不了解 GCC 的内部结构,所以我猜不出它为什么这样做。更有趣的是,我认为您没有启用优化(否则它将使用寄存器而不是
i的局部变量)。 -
也许这就是标准化比较的方式..
-
如果两者有任何不同的可能性,如果没有优化它就不会这样做。例如
if (a + 1 > 1)将通过优化简化为if (a > 0),但它可能不安全,因此不会这样做。