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

发布于 2022-09-05 21:42:18 字数 818 浏览 18 评论 0

在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 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

作死小能手 2022-09-12 21:42:18

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

遇到 2022-09-12 21:42:18

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

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

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

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文