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
不一定是一个糟糕的选择。尽管inc
和dec
具有较小的编码,这很有吸引力,但是它们遭受这样的事实,即它们仅部分更新标志,从而导致错误的依赖关系问题。英特尔优化手册包含以下注释(我强调):
关于optimization - GCC不使用inc,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/19890157/