关于i++,++i效率的问题!!下一篇blog打算写一下自定义类的自增效率问题。我事先在vc上运行过。其实必然是与编译器有着千丝万缕的联系,这里我们只针对vc。答案是效率一样,以下是我的反汇编结果:
之后偶然的机会在北邮人论坛上找到了讨论类似问题的一些回复,对方比我考虑的周到,所以这里就转载一篇人家的结论。对方可以说应该考虑的都考虑了!
首先声明,简单的比较前缀自增运算符和后缀自增运算符的效率是片面的,因为存在很多因素影响这个问题的答案。
首先考虑内建数据类型的情况:
如果自增运算表达式的结果没有被使用,而仅仅简单的用于增加一员操作数,答案是明确的,前缀法和后缀法没有任何区别,编译器的处理都应该是相同的,很难想象得出有什么编译器实现可以别出心裁在二者之间制造任何差异。
测试C++源代码如下:
//test1.cpp
void test()
{
int i=0;
i++;
++i;
}
Gnu C/C++ 2编译的汇编中间代码如下:
.file "test1.cpp"
gcc2_compiled.:
___gnu_compiled_cplusplus:
.text
.align 4
.globl _test__Fv
.def _test__Fv; .scl 2; .type 32; .endef
_test__Fv:
pushl %ebp
movl %esp,%ebp
subl $24,%esp
movl $0,-4(%ebp) ;i=0
incl -4(%ebp) ;i++
incl -4(%ebp) ;++i
jmp L3
jmp L2
.p2align 4,,7
L3:
L2:
leave
ret
很显然,不管是i++还是++i都仅仅是一条incl指令而已。
如果表达式的结果被使用,那么情况要稍微复杂一些。
测试C++源代码如下:
//test2.cpp
void test()
{
int i=0,a,b;
a=i++;
b=++i;
}
Gnu C/C++ 2编译的汇编中间代码如下:
.file "test2.cpp"
gcc2_compiled.:
___gnu_compiled_cplusplus:
.text
.align 4
.globl _test__Fv
.def _test__Fv; .scl 2; .type 32; .endef
_test__Fv:
pushl %ebp
movl %esp,%ebp
subl $24,%esp
movl $0,-4(%ebp) ;i=0
movl -4(%ebp),%eax ;i --> ax
movl %eax,-8(%ebp) ;ax --> a(a=i)
incl -4(%ebp) ;i++
incl -4(%ebp) ;++i
movl -4(%ebp),%eax ;i --> ax
movl %eax,-12(%ebp) ;ax --> b(b=i)
首先考虑内建数据类型的情况:
如果自增运算表达式的结果没有被使用,而仅仅简单的用于增加一员操作数,答案是明确的,前缀法和后缀法没有任何区别,编译器的处理都应该是相同的,很难想象得出有什么编译器实现可以别出心裁在二者之间制造任何差异。
测试C++源代码如下:
//test1.cpp
void test()
{
int i=0;
i++;
++i;
}
Gnu C/C++ 2编译的汇编中间代码如下:
.file "test1.cpp"
gcc2_compiled.:
___gnu_compiled_cplusplus:
.text
.align 4
.globl _test__Fv
.def _test__Fv; .scl 2; .type 32; .endef
_test__Fv:
pushl %ebp
movl %esp,%ebp
subl $24,%esp
movl $0,-4(%ebp) ;i=0
incl -4(%ebp) ;i++
incl -4(%ebp) ;++i
jmp L3
jmp L2
.p2align 4,,7
L3:
L2:
leave
ret
很显然,不管是i++还是++i都仅仅是一条incl指令而已。
如果表达式的结果被使用,那么情况要稍微复杂一些。
测试C++源代码如下:
//test2.cpp
void test()
{
int i=0,a,b;
a=i++;
b=++i;
}
Gnu C/C++ 2编译的汇编中间代码如下:
.file "test2.cpp"
gcc2_compiled.:
___gnu_compiled_cplusplus:
.text
.align 4
.globl _test__Fv
.def _test__Fv; .scl 2; .type 32; .endef
_test__Fv:
pushl %ebp
movl %esp,%ebp
subl $24,%esp
movl $0,-4(%ebp) ;i=0
movl -4(%ebp),%eax ;i --> ax
movl %eax,-8(%ebp) ;ax --> a(a=i)
incl -4(%ebp) ;i++
incl -4(%ebp) ;++i
movl -4(%ebp),%eax ;i --> ax
movl %eax,-12(%ebp) ;ax --> b(b=i)