i++ and ++i efficiency
其实这个问题,百度的话,有一大堆的参考资料,但是,在这里,我产生了一些困惑,他们所分析的结果,和我的测试代码不一致,这让我纠结了,所以,再次的写一下这个问题,顺顺思路。
我的测试环境:系统:Windows7 32bit,编程平台:Qt 5.3.1 (MSVC 2010,32bit)
首先说一下比较被大众所认可的结果:
(1)在自定义的数据类型的时候,因为前缀式(++i)可以返回对象的引用,而后缀式(i++),必须返回对象的数值,所以,导致在大的对象的时候产生了较大的复制开销,引起效率降低。所以,使用自定义的数据类型的时候,使用前缀式(++i)效率更好一些;
(2)如果是内置类型的,如int,效率是一样的。
(3)c++Primer上面有说:对于老旧的编译器++i效率好,对于好的编译器i++被优化了(效率一样)。表示该用哪个用哪个。
我的测试代码:
#include <iostream>
using namespace std;
//struct(1 data member)
struct oj
{
int j;
}a; //(2 data members) class
class oo
{
public:
oo():a(),b(){}
oo operator ++()//Prefix plus
{
++a;
++b;
return *this;
}
oo operator ++(int)//suffix plus
{
oo temp(*this);
a++;
b++;
return temp;
}
private:
int a;
int b;
};
int main()
{
int i=;
int x=;
//Built-in data types
i++;
++i;
x=i++;
x=++i; //struct(1 data member)
a.j = ;
a.i = ;
a.j++;
++a.j;
x = a.j++;
x = ++a.j; //(2 data members) class
oo o,ox;
o++;
++o;
ox = o++;
ox = ++o;
return ;
}
最接近机器语言的汇编
(1)先分析内建的数据类型:

分析结果如下:
对于内建的数据类型,单独使用i++和++i是没有效率区分的。但是,表达式中的i++和++i是有区别的,如上图所示,所以对于内建的表达式中的,根据需求,含有++i的表达式的效率要好一些。(注意,这里我强调的是整个表达式的效率。而非单纯的i++ and ++i.)
(2)自定义的数据类型(结构体):
如测试代码,这里使用了结构体,包含一个数据成员。

分析结果如下:
对于一个结构体(包含有一个数据成员)的自定义数据类型而言,单独的a.j++ and ++ a.j的效率是一样的,没有什么可争论的。但是,对于表达式的中的 x = a.j++ and x = ++a.j,这个表达式的效率,结果确出现了和“自定义的数据类型中,++i的效率更好”的违背。原因图片中已经解释过了,所以,对于表达式中含有自增和自减运算符的,在讨论表达式的效率的时候,不能单纯的使用理论依据,还应该考虑自己的平台环境,编译器的指令集系统,这里我想到了精简指令集和复杂指令集。
(3)自定义数据类型(类,2个数据成员,重载++运算符)

分析结果:
对于类对象的自增运算,我们重载了运算符。从汇编代码来看,不管是单独使用,还是含有自增运算符的表达式,O++操作,因为有入栈和出栈操作,所以,显得效率有些不佳。但是,在这里,我们完全没有考虑重载函数的运行效率,这里只是显示了函数的调用。其实,这里不用深究重载函数的效率了,单从C++语言就可以看出来。前缀的++i的重载函数的效率更好一些。
2个重载函数的汇编代码对比(左边为++i前缀的重载,右边为i++后缀的重载):

自我总结:
这里,我不想说,i++ 和 ++i的效率哪一个更好,通过上面的测试代码,我们可以发现,对于不同的环境,不同的数据结构会有不同的效率。我想说的是,通过发现一个问题,然后寻找答案,质疑答案,验证答案的这个过程,让我学会了不少东西。也许我的验证方法是不科学的,但是从中我认真的对待过,从中,学会了阅读汇编代码,这使我更加深刻的理解了机器对于程序的运行机制是什么样的。认真对待问题,你会从中收获很多的。
如果有面试官问你这样的问题的话,可以如下回答:
内建的数据类型时,效率一样。
但是,在自定义的数据类型的时候,因为前缀式(++i)可以返回对象的引用,而后缀式(i++),必须返回对象的数值
所以,导致在大的对象的时候产生了较大的复制开销,引起效率降低。
所以,使用自定义的数据类型的时候,使用前缀式(++i);
同时,真的需要在细节上提高自己程序效率的话,你可以写个简单的测试用例,测试一下。因为在自己的平台上测试,相对准确一些。没必要,像我这么纠结。
i++ and ++i efficiency的更多相关文章
- Design and Analysis of Algorithms_Fundamentals of the Analysis of Algorithm Efficiency
I collect and make up this pseudocode from the book: <<Introduction to the Design and Analysis ...
- 帕雷托最优(Pareto optimality)、帕雷托效率(Pareto efficiency)
帕雷托最优(英语:Pareto optimality),或帕雷托最适,也称为帕雷托效率(英语:Pareto efficiency),是经济学中的重要概念,并且在博弈论.工程学和社会科学中有着广泛的应用 ...
- Euro Efficiency(完全背包)
Euro Efficiency Time Limit : 2000/1000ms (Java/Other) Memory Limit : 20000/10000K (Java/Other) Tot ...
- Evaluation of Forwarding Efficiency in NFV-Nodes Toward Predictable Service Chain Performance
文章名称:Evaluation of Forwarding Efficiency in NFV-Nodes Toward Predictable Service Chain Performance 发 ...
- Efficiency optimizing
*low efficiency l_it_alv_stpox[] = g_it_alv_stpox[]. SORT l_it_alv_stpox BY zz_matnr idnrk. LOOP AT ...
- I.MX6 working note for high efficiency
/**************************************************************************** * I.MX6 working note f ...
- Along with all the above benefits, you cannot overlook the space efficiency and performance gains in using DataFrames and Dataset APIs for two reasons.
Of all the developers’ delight, a set of APIs that makes them productive, that are easy to use, and ...
- POJ 1252 Euro Efficiency(完全背包, 找零问题, 二次DP)
Description On January 1st 2002, The Netherlands, and several other European countries abandoned the ...
- Improving the Safety, Scalability, and Efficiency of Network Function State Transfers
Improving the Safety, Scalability, and Efficiency of Network Function State Transfers 来源:ACM SIGCOMM ...
- Overview of the High Efficiency Video Coding (HEVC) Standard阅读笔记
1.INTRODUCTION High Efficiency Video Coding(HEVC) <-> H.265 MPEG-4 Advanced Video Coding(AVC) ...
随机推荐
- 深入研究C语言 第一篇(续)
没有读过第一篇的读者,可以点击这里,阅读深入研究C语言的第一篇. 问题一:如何打印变量的地址? 我们用取地址符&,可以取到变量的偏移地址,用DS可以取到变量的段地址. 1.全局变量: 我们看到 ...
- mybatis框架中动态SQL的编写
1.动态SQL:在SQL语句中加入流程控制.比如加入if,foreach等. 重点掌握if语句: 案例1: <update id="updateItem" parameter ...
- 移动端H5页面的最佳终端适配之Flexible
lib-flexible是什么? lib-flexible是一个制作H5适配的开源库,可以点击这里下载相关文件,获取需要的JavaScript和CSS文件. 当然你可以直接使用阿里CDN: <s ...
- STM32 使用DMA+DAC+TIMER 输出正弦波
之前已经简单论述过,根据我个人菜鸟的了解与认识,对之前的知识进行整理回顾: DMA:我的理解就是一个通道,或者是一座桥梁.在静态内存到静态内存,或者外设到静态内存间的一个通讯的通道.建立这个通道的好处 ...
- OpenResty(nginx_lua_module)做ES代理以及备份ES数据
#user nobody; worker_processes 1; #error_log logs/error.log; #error_log logs/error.log notice; #erro ...
- [转]pycharm的一些快捷键
忙了好一阵终于忙完了,最近在重构代码,有许多地方要注释什么的,在多行注释时总是很麻烦,就想着pycharm有没有快捷键,就像visual studio一样.于是上Google搜一下PyCharm De ...
- __attribute__((packed))详解
1. __attribute__ ((packed)) 的作用就是告诉编译器取消结构在编译过程中的优化对齐,按照实际占用字节数进行对齐,是GCC特有的语法.这个功能是跟操作系统没关系,跟编译器有关 ...
- Oracle学习笔记1
查看登录用户 show user; 启用scott用户 alter user scott account unlock; 操作表空间 select * from dba_tablespaces; se ...
- CMM能力成熟度模型
CMM把软件企业的过程管理能力划分为5个等级: 1 .初始级:个别的.混乱无序的过程,软件缺乏定义,项目的成功严重依赖于某几个关键人员的努力.软件质量由个人的开发经验来保障. 2.可重复级 实施了基 ...
- 2016-11-15mysql优化笔记
1.mysql连接数:MYSQL数据库安装完成后,默认最大连接数是100,一般流量稍微大一点的论坛或网站这个连接数是远远不够的,连接数少的话,在大并发下连接数会不够用,会有很多线程在等待其他连接释放, ...