博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
《C和C++程序员面试秘笈》——1.4 i++与++i哪个效率更高
阅读量:6228 次
发布时间:2019-06-21

本文共 1423 字,大约阅读时间需要 4 分钟。

本节书摘来自异步社区出版社《C和C++程序员面试秘笈》一书中的第1章,第1.4节,作者: 董山海,更多章节内容可以访问云栖社区“异步社区”公众号查看。

1.4 i++与++i哪个效率更高

C和C++程序员面试秘笈

考点: i++和++i的效率比较

出现频率:

【解析】

在这里声明,简单地比较前缀自增运算符和后缀自增运算符的效率是片面的,因为存在很多因素影响这个问题的答案。首先考虑内建数据类型的情况:如果自增运算表达式的结果没有被使用,而是仅仅简单地用于增加一员操作数,答案是明确的,前缀法和后缀法没有任何区别,编译器的处理都应该是相同的,很难想象得出有什么编译器实现可以别出心裁地在二者之间制造任何差异。我们看看下面这个程序。

  #include 
  int main()  {    int i = 0;    int x = 0;    i++;    ++i;    x = i++;    x = ++i;    return 0;  }```上面的代码在VC++ 6.0中编译,得到的汇编如下。

; Line 5

  mov  DWORD PTR _i$[ebp], 0
; Line 6
  mov  DWORD PTR _x$[ebp], 0
; Line 8
  mov  eax, DWORD PTR _i$[ebp]
  add  eax, 1
  mov  DWORD PTR _i$[ebp], eax
; Line 9
  mov  ecx, DWORD PTR _i$[ebp]
  add  ecx, 1
  mov  DWORD PTR _i$[ebp], ecx
; Line 10
  mov  edx, DWORD PTR _i$[ebp]
  mov  DWORD PTR _x$[ebp], edx
  mov  eax, DWORD PTR _i$[ebp]
  add  eax, 1
  mov  DWORD PTR _i$[ebp], eax
; Line 11
  mov  ecx, DWORD PTR _i$[ebp]
  add  ecx, 1
  mov  DWORD PTR _i$[ebp], ecx
  mov  edx, DWORD PTR _i$[ebp]
  mov  DWORD PTR _x$[ebp], edx`
代码段第8行和第9行生成的汇编代码分别对应Line 8和Line 9下对应的汇编代码,可以看到3个步骤几乎完全一样。

代码段第10~11行生成的汇编代码分别对应Line 10和Line 11下对应的汇编代码,可以看到都是5个步骤,只是在加1的先后顺序上有一些区别,效率也是完全一样的。

由此说明,考虑内建数据类型时,它们的效率差别不大(去除编译器优化的影响)。所以在这种情况下,我们大可不必关心。

现在让我们再考虑自定义数据类型(主要是指类)的情况。此时我们不需要再做很多汇编代码的分析了,因为前缀式(++i)可以返回对象的引用,而后缀式(i++)必须返回对象的值,所以导致在大对象的时候产生了较大的复制开销,引起效率降低。因此处理使用者自定义类型(注意不是指内建类型)的时候,应该尽可能地使用前缀式递增/递减,因为它天生“体质”较佳。

【答案】

内建数据类型的情况,效率没有区别。

自定义数据类型的情况,++i效率较高。

转载地址:http://fsina.baihongyu.com/

你可能感兴趣的文章
每日英语:How to Save Detroit
查看>>
SQL中以count或sum为条件的查询方式
查看>>
[原]Windows Azure开发之Linux虚拟机
查看>>
[转]MySQL主从复制(Master-Slave)与读写分离(MySQL-Proxy)实践
查看>>
SqlServer查询中使用事务
查看>>
ipv6相关
查看>>
粒子加到骨骼中
查看>>
VS2010几款超赞的扩展辅助工具总结
查看>>
Tomcat embed
查看>>
Asp.Net Web API 2第六课——Web API路由和动作选择
查看>>
如何使用seajs+jQuery构建中型项目
查看>>
js html5推送 实例
查看>>
ASP.NET div信息提示框显示几秒后隐藏
查看>>
常用的正则表达式C#工具类
查看>>
IOS适配
查看>>
WhyDX9:翻写D3D红龙书中的程序
查看>>
RFC 4627 JSON
查看>>
UML类图
查看>>
Flex父子窗体相互调用
查看>>
AP_应付模组在月结的处理
查看>>