C++中i++和++i的区别
效果上的区别
i++是对变量i递增,但返回原值,++i是对变量i进行递增,并返回终值。
可以用以下代码加以验证:
int i = 0;
std::cout << i++ << std::endl;
i = 0;
std::cout << ++i << std::endl;
输出结果:
0
1
性能上的区别
分析汇编代码
从效果上的区别分析,++i要比i++性能高,但其实不一定是这样的,因为现在的许多编译器能对代码进行优化,本文使用Visual Studio 2019对i++和++i进行反汇编,结果如下:
i++
mov eax,dword ptr [i]
add eax,1
mov dword ptr [i],eax
++i
mov eax,dword ptr [i]
add eax,1
mov dword ptr [i],eax
可以看到,在没有赋值操作时,这两种写法的汇编代码完全相同,在性能上无任何区别。
接下来对i++和++i分别进行赋值操作,并查看反汇编,结果如下:
i++
mov eax,dword ptr [i]
mov dword ptr [b],eax
mov ecx,dword ptr [i]
add ecx,1
mov dword ptr [i],ecx
++i
mov eax,dword ptr [i]
add eax,1
mov dword ptr [i],eax
mov ecx,dword ptr [i]
mov dword ptr [a],ecx
可以看到,分别进行赋值操作后,这两种写法的汇编代码都使用了4个mov和一个add,只是顺序不同,并且使用了eax和ecx两个寄存器,所以它们在性能上依然没有区别。
进行性能实验
本文使用如下代码进行实验:
#include <iostream>
#include <ctime>
#include <Windows.h>
using namespace std;
int main()
{
clock_t start = 0;
clock_t end = 0;
Sleep(5000);
start = clock();
for (int i = 0; i < 1073741824; i++)
;
end = clock();
cout << "i++:" << end - start << endl;
start = clock();
for (int i = 0; i < 1073741824; ++i)
;
end = clock();
cout << "++i:" << end - start << endl;
system("pause");
return 0;
}
注:实验序号1先进行i++再进行++i,实验序号2先进行++i再进行i++。
| 实验序号 | i++ | ++i |
|---|---|---|
| 1 | 2306 | 2292 |
| 2 | 2291 | 2295 |
| 汇总 | 4597 | 4587 |
可以看到基本没有区别。
二者的选择
既然二者性能没有很大差异(甚至可以说无差异),那么在可以实现相同效果的前提下二者都可,但是这仅仅适用于普通的变量,在其他情况下,往往++i要优于i++,比如C++中的类(对象),因为++作为后缀需要产生一个新的临时对象,但是++作为前缀将不会产生该问题。
C++中i++和++i的区别的更多相关文章
- 【转】为什么我们都理解错了HTTP中GET与POST的区别
GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...
- Visual Studio 中 Build 和 Rebuild 的区别
因为之前写的程序比较小,编译起来比较快,所以一直都没有太在意 Build 和 Rebuild 之间的区别,后来发现两个还是有很大不同. Build 只针对在上次编译之后更改过的文件进行编译,在项目比较 ...
- SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别
SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是 EXEC 和 SP_EXECUTESQL ,我们先来看一下两种方 ...
- java集合中List与set的区别
java集合中List与set的区别. List可以存储元素为有序性并且元素可以相同. set存储元素为无序性并且元素不可以相同. 下面贴几段代码感受一下: ArrayL ...
- Java中Set Map List 的区别
java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...
- oracle中函数和存储过程的区别和联系【转载竹沥半夏】
oracle中函数和存储过程的区别和联系[转载竹沥半夏] 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己 ...
- JS中isPrototypeOf 和hasOwnProperty 的区别 ------- js使用in和hasOwnProperty获取对象属性的区别
JS中isPrototypeOf 和hasOwnProperty 的区别 1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的 ...
- Java中Comparable和Comparator接口区别分析
Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...
- 【jQuery】【转】jQuery中的trigger和triggerHandler区别
trigger(event, [data]) 在每一个匹配的元素上触发某类事件. 这个函数也会导致浏览器同名的默认行为的执行.比如,如果用trigger()触发一个'submit',则同样会导致浏览器 ...
- 转:Java中abstract和interface的区别
转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...
随机推荐
- jchdl - RTL实例 - And
https://mp.weixin.qq.com/s/86d_sFN0xVqk1xRaRyoAkg 使用rtl语法,实现简单的与门. 参考链接 https://github.com/wjcdx ...
- SpringBoot 及其 基本原理(一)
个人博客网:https://wushaopei.github.io/ (你想要这里多有) 前言: 分布式架构及微服务理念 1.SOA理念(思想) SOA :即 Service Oriented ...
- 使用Mac的Remote Desktop Manager连接ubuntu16.04 & Win10的远程桌面
疫情严重,公司实行远程办公.自己只有mac电脑,苦于3个系统间跨平台建立远程桌面. 今天,终于尝试成功!特来记录,以防别人踩坑! Mac远程软件安装 Remote Desktop Manager软件非 ...
- Java实现 蓝桥杯VIP 算法训练 筛选号码
算法训练 筛选号码 Description 有n个人围成一圈,顺序排号(编号为1到n).从第1个人开始报数(从1到3报数),凡报到3的人退出圈子.从下一个人开始继续报数,直到剩下最后一个人,游戏结束. ...
- Java实现 洛谷 P1598 垂直柱状图
题目描述 写一个程序从输入文件中去读取四行大写字母(全都是大写的,每行不超过100个字符),然后用柱状图输出每个字符在输入文件中出现的次数.严格地按照输出样例来安排你的输出格式. 输入格式 四行字符, ...
- java实现第六届蓝桥杯居民集会
居民集会 蓝桥村的居民都生活在一条公路的边上,公路的长度为L,每户家庭的位置都用这户家庭到公路的起点的距离来计算,第i户家庭距起点的距离为di. 每年,蓝桥村都要举行一次集会.今年,由于村里的人口太多 ...
- java实现第六届蓝桥杯饮料换购
饮料换购 饮料换购 乐羊羊饮料厂正在举办一次促销优惠活动.乐羊羊C型饮料,凭3个瓶盖可以再换一瓶C型饮料,并且可以一直循环下去,但不允许赊账. 请你计算一下,如果小明不浪费瓶盖,尽量地参加活动,那么, ...
- SpringCloud之Security
Spring Security是Spring提供的一个安全框架,提供认证和授权功能,最主要的是它提供了简单的使用方式,同时又有很高的灵活性,简单,灵活,强大. 我个人博客系统采用的权限框架就是Spri ...
- 【百度前端学院 Day4】背景边框列表链接和更复杂的选择器
1. 背景 背景指的是元素内容.内边距和边界下层的区域(可用background-clip修改) background-color 背景色 background-image 背景图片(url) b ...
- 讨论session共享方案设计
默认情况下,php的session文件是保存在磁盘文件中. 在php.ini配置文件中的配置项如下: session.save_handler = files session.save_path = ...