结论:
内建类型的情况下,效果一致:
自建类型下, 前缀表达式 ++i 效率 高于后缀表达式 i++。 (STL中 iterator 采用 ++i 这种前缀表达式)
过程:
我才用DEV C++ 5.9.2 的编译器查看反汇编代码。 (编译器应该做了优化,我判断不出来) 。代码段2 是代码段1 的汇编代码。 注释是我单步调试时,每段代码的对应汇编代码。
1. 自建类型下,汇编的操作 区别不大。(不考虑编译器优化的情况下)
单独自加时,是一致的;存在赋值的情况下,优化后,前缀表达式略高,不考虑优化,近乎一致。 多了临时变量
#include <stdio.h>
int main()
{
int i = 0;
int x = 0;
i++;
++i;
x = i++;
x = ++i;
return 0;
}
0x00000000004014f0 <+0>: push rbp
0x00000000004014f1 <+1>: mov rbp,rsp
0x00000000004014f4 <+4>: sub rsp,0x30
0x00000000004014f8 <+8>: call 0x402330 <__main>
0x00000000004014fd <+13>: mov DWORD PTR [rbp-0x4],0x0
0x0000000000401504 <+20>: mov DWORD PTR [rbp-0x8],0x0
0x000000000040150b <+27>: add DWORD PTR [rbp-0x4],0x1 //i++;
0x000000000040150f <+31>: add DWORD PTR [rbp-0x4],0x1 //++i;
0x0000000000401513 <+35>: mov eax,DWORD PTR [rbp-0x4] // x=i++;
0x0000000000401516 <+38>: lea edx,[rax+0x1] // x=i++;
0x0000000000401519 <+41>: mov DWORD PTR [rbp-0x4],edx // x=i++;
0x000000000040151c <+44>: mov DWORD PTR [rbp-0x8],eax // x=i++;
0x000000000040151f <+47>: add DWORD PTR [rbp-0x4],0x1 // x=i++;
0x0000000000401523 <+51>: mov eax,DWORD PTR [rbp-0x4] // x=i++;
0x0000000000401526 <+54>: mov DWORD PTR [rbp-0x8],eax // x=i++;
=> 0x0000000000401529 <+57>: mov eax,0x0
0x000000000040152e <+62>: add rsp,0x30
0x0000000000401532 <+66>: pop rbp
0x0000000000401533 <+67>: ret
2. 自建类型下 : 前缀表达式高于后缀表达式
从上面代码可以看出,后置++多了一个保存临时对象的操作,因此效率自然低一些。
Operator Operator::operator++()
{
++value; //内部成员变量
return *this;
}
Operator Operator::operator++(int)
{
Operator temp;
temp.value=value;
value++;
return temp;
}