GCC 编译器

$ gcc --version
gcc (GCC) 4.8.2
...

不会生成 inc 汇编指令,它实际上可能很有用,就像在这个 C 程序中一样:
int main(int argc, char **argv)
{
    int sum = 0;
    int i;
    for(i = 0; i < 1000000000L; i++)                     <---- that "i++"
        sum += i;
    return sum;
}

相反,它生成一个 add 指令:
0000000000000000 <main>:
   0:   31 d2                   xor    %edx,%edx
   2:   31 c0                   xor    %eax,%eax
   4:   0f 1f 40 00             nopl   0x0(%rax)
   8:   01 d0                   add    %edx,%eax
   a:   83 c2 01                add    $0x1,%edx         <---- HERE
   d:   81 fa 00 ca 9a 3b       cmp    $0x3b9aca00,%edx
  13:   75 f3                   jne    8 <main+0x8>
  15:   f3 c3                   repz retq

它为什么这样做?

编辑 :我使用 gcc -O2 来编译它。 gcc -Os 确实会生成 inc 指令。使用 inc 不是比空间优化更像是速度优化吗?

最佳答案

尝试使用-march=<your machine>。结果可能会有所不同。

但是,请注意add $1, %reg不一定是一个糟糕的选择。尽管incdec具有较小的编码,这很有吸引力,但是它们遭受这样的事实,即它们仅部分更新标志,从而导致错误的依赖关系问题。英特尔优化手册包含以下注释(我强调):

关于optimization - GCC不使用inc,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19890157/

10-12 23:57