为什么说++i的效率比i++高?
来源:公众号【编程珠玑】
作者:守望先生
网站:https://www.yanbinghu.com
前言
不知道你是否听说过++i比i++快的说法,真的如此吗?
++i与i++的区别
这两个表达式从我们初学编程语言的时候就会接触到。前者是自增后取值,后者是取值后自增。
#include <iostream>
using namespace std;
int main()
{int a = 0;int b = 0;int c = a++;//int tmp = a;c=a;a = a + 1int d = ++b;//b = b + 1;d = b;cout<<"c="<<c<<";d="<<d<<endl;return 0;
}
运行结果:
c=0;d=1
对于这个结果我们并不感到意外。
另外我们还注意到另外一个有意思的现象:
//来源:公众号【编程珠玑】地址:https://www.yanbinghu.com
#include <iostream>
using namespace std;
int main()
{int a = 0;int b = 0;int *c = &(a++);int *d = &(++b);return 0;
}
编译后报错:
main.cpp:7:19: error: lvalue required as unary ‘&’ operandint *c = &(a++);
说&作用于左值,也就是说a++的结果并非左值。但++b的结果是左值。
可简单理解左值和右值:
左值,有名对象,可赋值
右值,临时对象,不可被赋值
运算符重载
在《
//来源:公众号【编程珠玑】地址:https://www.yanbinghu.com
class Test
{
public:Test& operator++();//前置自增const Test operator++(int);//后置自增
private:int curPos; //当前位置
};
/*前置自增实现范式*/
Test& Test::operator++()
{++curPos; //自增return *this; //取值
}
/*后置自增实现范式,为了与前置区分开,多了一个int参数,但从来没用过*/
const Test Test::operator++(int)
{Test tmp = *this; //取值++curPos; //自增return tmp;
}
仔细观察后,我们发现前置自增,先自增,后返回原对象的对象;没有产生任何临时对象;而后置自增,先保存原对象,然后自增,最后返回该原临时对象,那么它就需要创建和销毁,这样一来,效率孰高孰低就很清楚了。
在不进行赋值的情况下,内置类型前置和后置自增的汇编都是一样的呢!
void test()
{int i = 0;i++;//++i;
}
汇编:
push rbp
mov rbp, rsp
mov DWORD PTR [rbp-4], 0
add DWORD PTR [rbp-4], 1
nop
pop rbp
ret
不过,赋值的情况下,并且不开启编译器优化,它们的汇编代码还是有差别的,有兴趣的可以试试。
总结
对于内置类型,前置和后置自增或者自减在编译器优化的情况下,两者并无多大差别,而对于自定义类型,如无特别需要,人们似乎更加偏爱前置自增或自减,因为后置自增常常会产生临时对象。
但是,又能提高多少效率呢?
推荐阅读:
为什么说++i的效率比i++高?相关推荐
- 为什么德国人工作这么慢,但效率却很高?
在互联网化发展的今天,所有的进程都在往"快"的方向不断发展.然而,做的快,就真的好吗?如果用半个月的时间推进一个本来需要一个月才能完成的项目,后面却用剩下半个月的时间来不停修正.那 ...
- java 删除zip文件_Java--字节缓冲流的效率有多高?测试一下
Java--字节缓冲流的效率有多高?测试一下 博客说明 文章所涉及的资料来自互联网整理和个人总结,意在于个人学习和经验汇总,如有什么地方侵权,请联系本人删除,谢谢! 说明 说缓冲流的效率特别高,那么今 ...
- 【效率特工队】Excel转手机通讯录格式,如何将一个Excel批量拆分生成多个vcf,怎么快速的加微信好友,优化一下方法效率可能更高,解决微信通讯录手机联系人好友不显示的问题
本文用到的软件下载地址 软件下载地址:https://share.weiyun.com/JG6ZNAv7 CSDN贵族下载地址:https://download.csdn.net/download/b ...
- 堆和栈访问效率哪个更高
1. 栈分配的软件优势: 栈分配算法简单,所以高效:堆分配算法相对比较复杂. 栈分配的硬件优势: 主要两点,cache和内存映射. 如果在 栈上分配小块内存,因为cache和内存映射已经建立 ,则效率 ...
- java和c哪个效率高_可以通俗详细地解释一下为什么C的效率比Java高?
谢邀. 首先说明一个问题:在说"低级语言"时,我们并不是指"这个语言好沙雕/没有有用的功能",毕竟大多数语言都做到了图灵完备,在表达能力方面是彼此等价的.一般来 ...
- 「AI 质检员」在富士通上岗,效率比人工高 25%
日本第一 IT 厂商富士通,于近日宣布开发了用于检测产品外观异常的 AI 技术,从而节省人力成本.材料成本等,同时也可节省声誉损失和退货/召回相关的成本,「无人工厂」已来. 来源 | Hyper超神经 ...
- 零售行业新渠道,效率居然这么高?
随着"互联网+"浪潮的退却,由人们的行为习惯和消费习惯的转变所带来的增长能量愈发捉襟见肘,如何在保持互联网时代积累下来的先进经验的基础上. 新零售业三大特点 01.首先以心为本,以 ...
- 一年两款新品 寒武纪的研发效率为何如此高?
本月,寒武纪在官网宣布推出第三代云端AI芯片思元370及搭载该芯片的MLU370-S4.MLU370-X4加速卡和全新升级的Cambricon Neuware软件栈等新品. 思元370是寒武纪首款采用 ...
- 【机器视觉】工业4.0时代之CCD视觉自动检测的高效冲压自动化效率有多高?
简单来说,CCD视觉检测系统就是用工业相机代替人眼睛去完成识别.测量.定位.判断等功能.视觉检测是指通过机器视觉产品将被摄取目标转换成图像信号,传送给专用的图像处理系统,根据像素分布和亮度.颜色等信息 ...
最新文章
- SQL Server查询备份日期和备份设备名
- Failed to resolve:com.android.support:appcompat-v7
- 利用gcc的-finstrument-functions获取函数轨迹跟踪
- apache 和 nginx 301重定向配置方法
- 【译】IPFS — The Permanent, Distributed Web
- MySQL Workbench的使用教程 (初级入门版)
- spring AOP解说
- python 切片器_PowerBI-将日期显示为星期作为切片器
- 【Flink】Flink 实时超时统计-A发生B不发生事件统计-不发生事件
- 探讨SQL Server中Case 的不同用法
- 川大计算机复试公平吗,看清华、川大这波操作,你还会担心网络复试会不公平吗?...
- 【转载】SQL中declare申明变量 declare @id int
- 今天接触个新概念——竞争情报
- 启用Hadoop集群垃圾箱配置
- Chinese Dragon
- 顺丰打印电子运单报500问题解决
- A Novel Lip Descriptor for Audio-Visual Keyword Spotting Based on Adaptive Decision Fusion(2016)
- UI组件库的引用方式
- 万能的3d打印机真的江郎才尽了吗
- [Luogu P4228] [LOJ 2330] 榕树之心
热门文章
- 【数据结构】顺序串的插入算法,删除算法,连接运算,顺序串求子串算法
- 疫情排查节时86%?不会代码也能玩转模型训练?腾讯大神揭秘语音语义及AutoML黑科技 | 内含福利...
- 技术驰援抗疫一线, Python 线上峰会免费学!
- NLP这两年:15个预训练模型对比分析与剖析
- 性能比GPU高100倍!华人教授研发全球首个可编程忆阻器AI计算机
- 百度宣布:搜索业务总裁向海龙离职,另回购10亿美元股份
- 不需要程序员,产品经理也能10分钟打造一个深度学习模型
- OpenAI发布最新「模拟机器人环境」,用「真实机器人」模型进行训练
- AI一分钟 | 富士康押宝人工智能,将投资21亿元用于AI研发
- Redis 分布式锁如何自动续期