效果上的区别

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,只是顺序不同,并且使用了eaxecx两个寄存器,所以它们在性能上依然没有区别。

进行性能实验

本文使用如下代码进行实验:

#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的区别的更多相关文章

  1. 【转】为什么我们都理解错了HTTP中GET与POST的区别

    GET和POST是HTTP请求的两种基本方法,要说它们的区别,接触过WEB开发的人都能说出一二. 最直观的区别就是GET把参数包含在URL中,POST通过request body传递参数. 你可能自己 ...

  2. Visual Studio 中 Build 和 Rebuild 的区别

    因为之前写的程序比较小,编译起来比较快,所以一直都没有太在意 Build 和 Rebuild 之间的区别,后来发现两个还是有很大不同. Build 只针对在上次编译之后更改过的文件进行编译,在项目比较 ...

  3. SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别

    SQL Server 中 EXEC 与 SP_EXECUTESQL 的区别 MSSQL为我们提供了两种动态执行SQL语句的命令,分别是 EXEC 和 SP_EXECUTESQL ,我们先来看一下两种方 ...

  4. java集合中List与set的区别

       java集合中List与set的区别.     List可以存储元素为有序性并且元素可以相同.     set存储元素为无序性并且元素不可以相同.     下面贴几段代码感受一下: ArrayL ...

  5. Java中Set Map List 的区别

    java中set map list的区别: 都是集合接口 简要说明 set --其中的值不允许重复,无序的数据结构 list   --其中的值允许重复,因为其为有序的数据结构 map--成对的数据结构 ...

  6. oracle中函数和存储过程的区别和联系【转载竹沥半夏】

    oracle中函数和存储过程的区别和联系[转载竹沥半夏] 在oracle中,函数和存储过程是经常使用到的,他们的语法中有很多相似的地方,但也有自己的特点.刚学完函数和存储过程,下面来和大家分享一下自己 ...

  7. JS中isPrototypeOf 和hasOwnProperty 的区别 ------- js使用in和hasOwnProperty获取对象属性的区别

    JS中isPrototypeOf 和hasOwnProperty 的区别 1.isPrototypeOf isPrototypeOf是用来判断指定对象object1是否存在于另一个对象object2的 ...

  8. Java中Comparable和Comparator接口区别分析

    Java中Comparable和Comparator接口区别分析 来源:码农网 | 时间:2015-03-16 10:25:20 | 阅读数:8902 [导读] 本文要来详细分析一下Java中Comp ...

  9. 【jQuery】【转】jQuery中的trigger和triggerHandler区别

    trigger(event, [data]) 在每一个匹配的元素上触发某类事件. 这个函数也会导致浏览器同名的默认行为的执行.比如,如果用trigger()触发一个'submit',则同样会导致浏览器 ...

  10. 转:Java中abstract和interface的区别

    转自:Java中abstract和interface的区别 abstract class和interface是Java语言中对于抽象类定义进行支持的两种机制,正是由于这两种机制的存在,才赋予了Java ...

随机推荐

  1. 本地计算机上的MySQL80服务启动后停止,某些服务在未由其他服务或者程序使用时将自动停止

    是由于mysql server XX 路径下的my.ini文件发生错误. 高版本的mysql server的my.ini文件不在mysql server XX路径下,在programdata文件夹(查 ...

  2. java方法句柄-----5.Method Handles in Java

    Method Handles in Java 目录 Method Handles in Java 1.介绍 2.什么是MethodHandle 3. Method Handles vs Reflect ...

  3. Java实现 LeetCode 787 K 站中转内最便宜的航班(两种DP)

    787. K 站中转内最便宜的航班 有 n 个城市通过 m 个航班连接.每个航班都从城市 u 开始,以价格 w 抵达 v. 现在给定所有的城市和航班,以及出发城市 src 和目的地 dst,你的任务是 ...

  4. Java实现蓝桥杯第十一届校内模拟赛

    有不对的地方欢迎大佬们进行评论(ง •_•)ง 多交流才能进步,互相学习,互相进步 蓝桥杯交流群:99979568 欢迎加入 o( ̄▽ ̄)ブ 有一道题我没写,感觉没有必要写上去就是给你多少MB然后求计 ...

  5. Java实现 LeetCode 114 二叉树展开为链表

    114. 二叉树展开为链表 给定一个二叉树,原地将它展开为链表. 例如,给定二叉树 1 / \ 2 5 / \ \ 3 4 6 将其展开为: 1 \ 2 \ 3 \ 4 \ 5 \ 6 class S ...

  6. Java实现 LeetCode 31下一个排列

    31. 下一个排列 实现获取下一个排列的函数,算法需要将给定数字序列重新排列成字典序中下一个更大的排列. 如果不存在下一个更大的排列,则将数字重新排列成最小的排列(即升序排列). 必须原地修改,只允许 ...

  7. 第六届蓝桥杯JavaB组国(决)赛真题

    解题代码部分来自网友,如果有不对的地方,欢迎各位大佬评论 题目1.分机号 X老板脾气古怪,他们公司的电话分机号都是3位数,老板规定,所有号码必须是降序排列,且不能有重复的数位.比如: 751,520, ...

  8. java实现第二届蓝桥杯地铁换乘(C++)

    地铁换乘. 为解决交通难题,某城市修建了若干条交错的地铁线路,线路名及其所属站名如stations.txt所示. 线1 苹果园 .... 四惠东 线2 西直门 车公庄 .... 建国门 线4 .... ...

  9. Java实现第九届蓝桥杯第几个幸运数字

    第几个幸运数字 题目描述 到x星球旅行的游客都被发给一个整数,作为游客编号. x星的国王有个怪癖,他只喜欢数字3,5和7. 国王规定,游客的编号如果只含有因子:3,5,7,就可以获得一份奖品. 我们来 ...

  10. Java并发编程实战总结 (一)

    前提 首先该场景是一个酒店开房的业务.为了朋友们阅读简单,我把业务都简化了. 业务:开房后会添加一条账单,添加一条房间排期记录,房间排期主要是为了房间使用的时间不冲突.如:账单A,使用房间1,使用时间 ...