海湾合作委员会的变化小于或等于

时间:2013-03-30 11:28:28

标签: gcc assembly gdb

我有以下简单的程序,我正在使用它来刷新我对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 < 10i <= 9的比较。鉴于这些是整数比较,应该没有区别,但我想知道GCC是否有任何理由输出这个程序集,而不是与10进行比较并且如果小于(JL)则跳跃?

编辑:这是在具有64位处理器的计算机上运行的Ubuntu与GCC 4.6.3和GDB 7.4-2012.04。

3 个答案:

答案 0 :(得分:5)

执行速度不应该有差异。我认为gcc通常会为这种比较发出jle,并在生成的程序集中保持一致性。

答案 1 :(得分:2)

只要可观察行为相同,就允许编译器执行优化。这称为 As-If rule 。由于两种情况的可观察行为相同,因此允许编译器在两者中的任何一个中生成汇编代码。即使您没有启用任何优化,也是如此。

答案 2 :(得分:0)

这不是有效的优化,只是另一种写入相同的方式。使用-O标志进行编译会生成更复杂的优化。