i++ 和 ++i 效率的分析以及自定义类型的自增/自减运算符重载实例

From: http://blog.csdn.net/leo115/article/details/8101541

我们通常在写for循环 的时候,要实现变量 i 的自增 1 ;往往会在i++ 和++i中随便挑一种写,对于i++和++i的理解,我们往往停留在返回的值的不同,其实i++与++i在实现效率上也有一定的不同(不考虑编译器优化的原因)。

++i的实现效率更高

解释如下:

i++ (在C++中) 在实现的时候,系统会产生一个 local object class INT的临时变量 用于存储原有的数据供返回值用;

[cpp] view plaincopy
  1. ++i 的实现方式   
  2. INT INT::operator++()  
  3. {  
  4.     *this = *this +1;  
  5.     return *this;  
  6. }  
  7.   
  8. i++的实现方式  
  9.   
  10. const INT INT::operator++(int)  
  11. {  
  12.     INT oldvalue = *this;  
  13.     *this = *this+1;  
  14.     return oldvalue;  
  15. }  
所以从效率上来说 ++i 比 i++来的更有效率。

++i更高效

说明:

1、在不考虑编译器优化的条件下,前缀(++i)比后缀(i++)要少一步开辟临时变量的操作,所以前缀效率更高。

2、对于内置数据类型,由于编译器优化的原因,前缀和后缀的效率没什么差别。

例如:对于 int 型变量,编译器可以优化掉开辟临时变量这份多余的工作。

3、对于自定义的数据类型(类),我们在使用 自增 运算符的时候,需要重载 ++ 运算符,在重载的时候,后缀要开辟一个临时变量,所以前缀的效率要比后缀的更高。

Stl中迭代器使用的是 前缀

自定义类型的 前缀和后缀 的重载的 实现方式如下:

说明:如果考虑对 前缀(++i --i) 重载形式为  Type operator++() ;

    后缀(i++ i--)的重载形式为:Type operator++(int); (这样定义是为了实现前缀与后缀的区分)

[cpp] view plaincopy
  1. #include <iostream>  
  2.   
  3. using namespace std;  
  4.   
  5. class PlusOne  
  6. {  
  7. public:  
  8.     int val;  
  9. public:  
  10.     PlusOne(int a):val(a){}  
  11.     PlusOne operator++();  
  12.     PlusOne operator++(int);  
  13.     int getval() {return this->val;}  
  14. };  
  15. PlusOne PlusOne::operator++()  
  16. {  
  17.     this->val += 1;  
  18.     cout<<this->val<<endl;  
  19.     return *this;  
  20. }  
  21. PlusOne PlusOne::operator++(int)  
  22. {  
  23.     PlusOne tmp(*this);  
  24.     this->val += 1;  
  25.     cout<<this->val<<endl;  
  26.     return tmp;  
  27. }  
  28.   
  29.   
  30. int main()  
  31. {  
  32.     PlusOne po(10);  
  33.     PlusOne po1 = ++po;  
  34.     PlusOne po2 = po++;  
  35.     cout<<"po1.val:"<<po1.getval()<<endl;  
  36.     cout<<"po2.val:"<<po2.getval()<<endl;  
  37.     return 0;  
  38. }  

运算结果如下:




本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/404400.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

day②:字典的fromkeys方法

start##fromkeys方法本身就是把所有的key都指向同一个对象了>>> cdict.fromkeys(range(5),[]) >>> c{0: [], 1: [], 2: [], 3: [], 4: []}>>> c[0].append({"B":{123}})>>> c{0: [{B: set([123])}], 1: [{B: se…

[react-router] React-Router的实现原理是什么?

[react-router] React-Router的实现原理是什么&#xff1f; 1.react-router依赖基础 - history&#xff0c;是一个独立的第三方js库&#xff0c;可以用来兼容在不同浏览器、不同环境下对历史记录的管理&#xff0c;拥有统一的API。具体来说里面的history分为三类: HashRouter…

Linux Bash Shell入门教程

BASH 的基本语法 最简单的例子 —— Hello World! 关于输入、输出和错误输出 BASH 中对变量的规定&#xff08;与 C 语言的异同&#xff09; BASH 中的基本流程控制语法 函数的使用 2.1 最简单的例子 —— Hello World! 几乎所有的讲解编程的书给读者的第一个例子都是…

[react] 请描述下事件在react中的处理方式是什么?

[react] 请描述下事件在react中的处理方式是什么&#xff1f; 所有时间都挂载到 document 上&#xff0c;然后捕获对应的 dom。 类似事件委托 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录…

BZOJ 1146: [CTSC2008]网络管理Network( 树链剖分 + 树状数组套主席树 )

树链剖分完就成了一道主席树裸题了, 每次树链剖分找出相应区间然后用BIT(可持久化)权值线段树就可以完成计数. 但是空间问题很严重....在修改时不必要的就不要新建, 直接修改原来的..详见代码. 时间复杂度O(N*log^3(N))------------------------------------------------------…

标准RTSP 消息的错误代码

From: http://blog.csdn.net/ameyume/article/details/7441060 标准RTSP消息的错误代码–在应答消息的第一行表示 ”100” ; Continue (all 100 range) “110”; Connect Timeout “200” ; OK ”201” ; Created ”250” ; Low on Storage Space ”300” ; Multiple Choic…

[react-router] React-Router怎么设置重定向?

[react-router] React-Router怎么设置重定向&#xff1f; 采用 Redirect 进行重定向 个人简介 我是歌谣&#xff0c;欢迎和大家一起交流前后端知识。放弃很容易&#xff0c; 但坚持一定很酷。欢迎大家一起讨论 主目录 与歌谣一起通关前端面试题

struts2遍历select

2019独角兽企业重金招聘Python工程师标准>>> <s:bean name"org.apache.struts2.util.Counter" id"counter"> <s:param name"first" value"1" /> <s:param name"last" value"pageCount"…

[建议]我对软工有话说(上)

我对软工有话说 经历了一学期的软件工程课程实践&#xff0c;先给个自己在这门课中学到的东西打个分&#xff1a; 编码能力&#xff1a;★★★代码质量&#xff1a;★★★★团队管理&#xff1a;★★★★★风险控制&#xff1a;★★★★解决问题的能力&#xff1a;★★★★★下…

[react-router] React-Router的路由有几种模式?

[react-router] React-Router的路由有几种模式&#xff1f; 1、BrowserRouter&#xff1a;浏览器的路由方式&#xff0c;也就是在开发中最常使用的路由方式 2、HashRouter&#xff1a;在路径前加入#号成为一个哈希值&#xff0c;Hash模式的好处是&#xff0c;再也不会因为我们…

Spring MVC X-Frame-Options

https://docs.spring.io/spring-security/site/docs/current/reference/html/headers.html#headers-frame-options 转载于:https://www.cnblogs.com/heshuai/p/5132141.html

[react] react组件间的通信有哪些?

[react] react组件间的通信有哪些&#xff1f; PropsContextref&#xff1a;通过Ref获取组建的实例&#xff0c;在通过实例拿到组件的属性值或者方法的回调 第三方的&#xff0c;Redux是基于Conext基础上的库&#xff0c;Mobx这是依赖收集&#xff0c;EventBus是发布订阅模式&…

Fedora开机自动登录指定用户(root或普通用户)

From: http://www.360doc.com/content/12/0709/11/6828497_223143657.shtml 2010-07-19 12:53:04| 分类&#xff1a;Linux学习 | 标签&#xff1a;|字号大中小 订阅 自从Fedora 10开始&#xff0c;以后版本默认均无法在GUI下界面以root账号登录。其实这个设计是比较好的&…

android中心类库

android开发过程中总会用到各种各样的类库&#xff0c;也即jar包&#xff0c;以下地址可以满足您的需求 地址&#xff1a;http://search.maven.org/转载于:https://www.cnblogs.com/kangweifeng/p/5133233.html

[react-router] 在history模式中push和replace有什么区别?

[react-router] 在history模式中push和replace有什么区别&#xff1f; push()&#xff1a;添加一个新的记录到历史堆栈, history.length1。&#xff08;一般会用来跳转到一个新页面, 用户点击浏览器的回退按钮可以回到之前的路径。&#xff09; replace()&#xff1a;替换掉当…

Web安全开发注意事项

1.sql注入&#xff1a;这个很常规了&#xff0c;不要拼字符串以及过滤关键字都可以防住&#xff0c;需要注意的是&#xff0c;Cookie提交的参数也是可以导致注入漏洞的。 2.旁注&#xff1a;就是说在保证自己的程序没问题的同时&#xff0c;也要保证同台服务器的其他站点没问题…

[react-router] React-Router 4怎样在路由变化时重新渲染同一个组件?

[react-router] React-Router 4怎样在路由变化时重新渲染同一个组件&#xff1f; 1.在同一个组件添加不同的key,以下重新封装了组件&#xff1a; export default function (props) {return (<组件 {...props} key{search参数} />) }2.但是不知道在路由跳转的地方加入ke…

Oracle 彻底 kill session

为什么80%的码农都做不了架构师&#xff1f;>>> --*************************** -- Oracle 彻底 kill session --*************************** kill session 是DBA经常碰到的事情之一。如果kill 掉了不该kill 的session&#xff0c;则具有破坏性&#xff0c;因此尽…

消灭编译警告(Warning)

From: http://blog.csdn.net/liuysheng/article/details/7165143 如何看待编译警告 当编译程序发现程序中某个地方有疑问&#xff0c;可能有问题时就会给出一个警告信息。警告信息可能意味着程序中隐含的大错误&#xff0c;也可能确实没有问题。对于警告的正确处理方式应该…

[react-router] React-Router 3和React-Router 4有什么变化?添加了什么好的特性?

[react] React-Router 3和React-Router 4有什么变化&#xff1f;添加了什么好的特性&#xff1f; React-Router 4 从设计思想上进行改变&#xff0c;引入动态路由&#xff0c;将路由进行了拆分&#xff0c;将其放到了各自的模块中&#xff0c;不再有单独的 router 模块&#x…