在C++中,++前置和++后置在运算符重载时,一个有使用临时对象,一个没(在前置++返回引用时),执行效率就产生了差异。听别人说C语言上也是这样。
于是我建了个.c文件查看代码的反汇编,但是我在看C++反汇编时,发现a++与++a只不过是在执行顺序和左值变量最终值不一样而已,请问这个为啥了?附上代码在VS2010的反汇编代码:
b = a++;
000D13AC mov eax,dword ptr [a]
000D13AF mov dword ptr [b],eax
000D13B2 mov ecx,dword ptr [a]
000D13B5 add ecx,1
000D13B8 mov dword ptr [a],ecx
a = ++b;
000D13BB mov eax,dword ptr [b]
000D13BE add eax,1
000D13C1 mov dword ptr [b],eax
000D13C4 mov ecx,dword ptr [b]
000D13C7 mov dword ptr [a],ecx
发现a++与++a只不过是在执行顺序和左值变量最终值不一样而已,请问这个为啥了?难度前置++和后置++在执行效率是一样的(但是从好多地方了解到,前置++效率高一些)?或是有其他什么原因,本人小白刚学C++,请大牛们明示
你这样的方法是看不出来的。因为都是基本类型,还有赋值操作。
一般有区别的是for循环里的i++和++i。
特别是如果i是一个迭代器,那么++i的确不会产生临时对象的构造析构问题。
的确是按照标准里这里理应有临时对象的,传统的编译器也是这么实现的。
但是编译器可以根据需要做一定优化的,省略临时对象的过程,尤其对于基本类型。
不过如果你重载了++运算符等情况,这个临时对象就应该不会省略了。
比如
(++(a.fn())).fn()
和((a.fn())++).fn()
。后者应该会明确调用了临时对象的方法。