C语言++前置与++后置汇编问题,本人小白

我是小白哈哈哈
  • 96

在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++,请大牛们明示

回复
阅读 2.7k
2 个回答
bokutake
  • 2.1k
✓ 已被采纳

你这样的方法是看不出来的。因为都是基本类型,还有赋值操作。
一般有区别的是for循环里的i++和++i。
特别是如果i是一个迭代器,那么++i的确不会产生临时对象的构造析构问题。
的确是按照标准里这里理应有临时对象的,传统的编译器也是这么实现的。
但是编译器可以根据需要做一定优化的,省略临时对象的过程,尤其对于基本类型。
不过如果你重载了++运算符等情况,这个临时对象就应该不会省略了。
比如(++(a.fn())).fn()((a.fn())++).fn()。后者应该会明确调用了临时对象的方法。

月之领主LM
  • 2.7k

你不如试试分析下(i++)+(++i)+(i++)+(++i)是个什么东西?
然后试试看不同的编译、运行环境,出来的是不是一样的结果

研究++i和i++的执行效率,我也是醉了。
你家代码的性能问题出在你用了++i,而不是用i++?
谁告诉你执行效率会有差异?多少年前的教材了?
谁告诉你反汇编能用来分析这种场景的性能问题了?

考虑这么无聊的问题,不如先去百度下,什么叫编译器优化
我不是大牛,但是可以告诉你一点人生经验,研究这种无聊的奇技淫巧是没有前途的

宣传栏