涼宮こなた 2020-11-28 19:57 采纳率: 100%
浏览 24
已采纳

关于 i++ 和 ++i 的性能对比问题

纯小白,上次jd面试官问我,在使用效果相同的情况下,i++和++i哪个更好,我没答上来,后来反问面试官,面试官跟我说i++要多一步拷贝,我觉得确实有道理,回宿舍写了个代码想测试一下

int N = 8;
int a = N--;

N = 8;
int b = --N;

编译完看了下汇编代码,确实多了一行,单步调试终于搞懂了每行的含义

  40155d:	c7 45 fc 08 00 00 00 	movl   $0x8,-0x4(%rbp)  //N = 8
  401564:	8b 45 fc             	mov    -0x4(%rbp),%eax  //$eax = N
  401567:	8d 50 ff             	lea    -0x1(%rax),%edx  //$edx = $rax - 1
  40156a:	89 55 fc             	mov    %edx,-0x4(%rbp)  //N = $edx
  40156d:	89 45 f8             	mov    %eax,-0x8(%rbp)  //a = $eax

  401570:	c7 45 fc 08 00 00 00 	movl   $0x8,-0x4(%rbp)  //N = 8
  401577:	83 6d fc 01          	subl   $0x1,-0x4(%rbp)  //N -= 1
  40157b:	8b 45 fc             	mov    -0x4(%rbp),%eax  //$eax = N
  40157e:	89 45 f4             	mov    %eax,-0xc(%rbp)  //b = $eax

可是问题来了,这部分的编译结果为啥不能是这样呢

	movl	$8, -4(%rbp)
	movl	-4(%rbp), %eax
	movl	%eax, -8(%rbp)
	subl	$1, -4(%rbp)
	
	movl	$8, -4(%rbp)
	subl	$1, -4(%rbp)
	movl	-4(%rbp), %eax
	movl	%eax, -12(%rbp)

这样两种写法在性能上不就一样了吗

  • 写回答

25条回答 默认 最新

  • include_iostream_ 2020-12-03 18:32
    关注

    一言以蔽之:你给的样例汇编代码也提前了一个序列点,这没有严格按照朴素的序列点顺序进行操作,而是进行了序列点分析优化后写出的四行代码,这怎么能认为是没有优化呢?

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(24条)

报告相同问题?

悬赏问题

  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 截图中的mathematics程序转换成matlab
  • ¥15 动力学代码报错,维度不匹配
  • ¥15 Power query添加列问题
  • ¥50 Kubernetes&Fission&Eleasticsearch
  • ¥15 報錯:Person is not mapped,如何解決?
  • ¥15 c++头文件不能识别CDialog