i++和++i
swofford
posted @ 2010年9月30日 11:20
in C
, 2190 阅读
在 Chito 开发者的一篇日志中,评论下面有人说传说中 ++i 比 i++ 的效率高,看 K&R 的书,上面的自增也是用 ++i,感觉有点好奇,就照葫芦画瓢,按这篇文章中的方法用 gcc 反了一下,却发现两者汇编代码一样……
test.c
#include <stdio.h> int main(void) { int i; i = 0; i++; return 0; }
test2.c
#include <stdio.h> int main(void) { int i; i = 0; ++i; return 0; }
反后的汇编代码
test.s
.file "test.c" .def ___main; .scl 2; .type 32; .endef .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp subl $8, %esp andl $-16, %esp movl $0, %eax addl $15, %eax addl $15, %eax shrl $4, %eax sall $4, %eax movl %eax, -8(%ebp) movl -8(%ebp), %eax call __alloca call ___main movl $0, -4(%ebp) leal -4(%ebp), %eax incl (%eax) movl $0, %eax leave ret
test2.s
.file "test.c" .def ___main; .scl 2; .type 32; .endef .text .globl _main .def _main; .scl 2; .type 32; .endef _main: pushl %ebp movl %esp, %ebp subl $8, %esp andl $-16, %esp movl $0, %eax addl $15, %eax addl $15, %eax shrl $4, %eax sall $4, %eax movl %eax, -8(%ebp) movl -8(%ebp), %eax call __alloca call ___main movl $0, -4(%ebp) leal -4(%ebp), %eax incl (%eax) movl $0, %eax leave ret
具体如上了,比较了一下两者,是一样的,难道传说中的 ++i 比 i++ 效率高是假的? ==!!
我的水平很菜,若是有地方错了,欢迎各位指出。
2010年9月30日 13:18
嗯,赞较真!
那个话是我“传说”的。
不过,你用的例子,自然是看不出效率的。我那个传说,是有语境的。该用 ++i 的时候,如果用 i++,可能会导致代码行增多,所以我说前者效率低。
2010年9月30日 13:20
@Garfileo: s/前者效率低/前者效率高/g
2010年10月02日 00:41
简单的整数自加这个会被优化掉吧
理论上说i++会产生一个临时变量浪费空间,所以能用++i就用++i吧
2010年10月05日 11:28
你可以在在看看vc的实现过程,看有无差异
2010年10月16日 11:07
http://hi.baidu.com/afeiqiang020/blog/item/015f0709f8656084d1581bae.html
//有int参数的表示后置自加
int operator ++ ()
{
return i += 1;
}
int operator ++(int i)
{
int k = i;
i += 1;
return k;
}