我有一个简单的程序,我正在用它来唤醒我对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和GDB7.4-2012.04。
发布于 2013-03-30 19:44:17
在执行速度上应该没有区别。我认为gcc通常会发出jle来进行这样的比较,并且为了在生成的程序集中保持一致而这样做。
发布于 2013-03-30 19:45:06
只要可观察到的行为相同,编译器就可以执行优化。这就是所谓的。由于这两种情况的可观察行为是相同的,因此允许编译器生成这两种情况中的任何一种汇编代码。即使您没有启用任何优化,也是如此。
发布于 2013-03-30 19:39:39
这不是有效的优化,只是编写相同代码的另一种方式。使用-O标志进行编译会生成更复杂的优化。
https://stackoverflow.com/questions/15718021
复制相似问题