C语言++前置与++后置汇编问题,本人小白
在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++,请大牛们明示
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
你这样的方法是看不出来的。因为都是基本类型,还有赋值操作。
一般有区别的是for循环里的i++和++i。
特别是如果i是一个迭代器,那么++i的确不会产生临时对象的构造析构问题。
的确是按照标准里这里理应有临时对象的,传统的编译器也是这么实现的。
但是编译器可以根据需要做一定优化的,省略临时对象的过程,尤其对于基本类型。
不过如果你重载了++运算符等情况,这个临时对象就应该不会省略了。
比如
(++(a.fn())).fn()
和((a.fn())++).fn()
。后者应该会明确调用了临时对象的方法。你不如试试分析下
(i++)+(++i)+(i++)+(++i)
是个什么东西?然后试试看不同的编译、运行环境,出来的是不是一样的结果?
研究++i和i++的执行效率,我也是醉了。
你家代码的性能问题出在你用了++i,而不是用i++?
谁告诉你执行效率会有差异?多少年前的教材了?
谁告诉你反汇编能用来分析这种场景的性能问题了?
考虑这么无聊的问题,不如先去百度下,什么叫编译器优化?
我不是大牛,但是可以告诉你一点人生经验,研究这种无聊的奇技淫巧是没有前途的。