++i和i++
我曾经在一本书上看到,在单独用 i++ 或者 ++i 的时候,++i 比 i++的执行效率高一些。我想了半天,还是搞不明白。我看linux内核也都用的是i++,所以我就怀疑这个说法了。有谁知道吗?是不是真的高一些啊?请详细的讲解一下,谢谢! :shock: 你的那本书是讲C++的吧
我记得C++里面,如果你重载了++运算符,后置++是通过前置++实现的 have nothing to do with kernel 是讲 c++ 的!
我昨天又看了一遍,似乎明白了一点。当初没有看那么细。
不过如果是基本的数据类型,如整形,是不是经过编译后就是一样的了? a=++i表示先做++运算,然后做赋值给a.
a=i++表示在赋值后做+=运算 应该是一样的。
为什么++会单独成为一条指令呢?原理上它和i=i+1是一样的。因为例如intel cpu上有专门的inc 这条指令,就是自加一指令,它比普通的add指令要快。我想大部分cpu也有这条指令,所以,经过编译后,都应该变成inc指令,所以我认为不会有性能区别。 不知道,猜想:
int i_inc(int i)
{
int j;
j = i;
i = i + 1;
return j;
}
int inc_i(int i)
{
i = i + 1;
return i;
}
具体得看汇编。 这个和编译器有关吧 看汇编代码吧
好象i++和++i单独成一条语句是没什么区别
int main()
{
int i;
i++;
++i;
}
.file "u.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
movl %eax, -8(%ebp)
movl -8(%ebp), %eax
call __alloca
call ___main
leal -4(%ebp), %eax
incl (%eax)
leal -4(%ebp), %eax
incl (%eax)
leave
ret 如果i是整数当然没多少差别,但是如果i是一个很庞大的对象,那么++i好象会先返回一个临时的对象然后再执行++操作,这样的开销差别就会比较明显,好象是这样的…… 怎么还有这种说法呢?它们是代表不同的意思啊,就是有效率的问题也不能混淆的啊,更何况是否存在效率问题还有待考证,反正我是不同意这样的说法,也没有为什么,只是靠编程的经验
页:
[1]