效果上的区别

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++中的类(对象),因为++作为后缀需要产生一个新的临时对象,但是++作为前缀将不会产生该问题。

最新文章

  1. Drop all the tables, stored procedures, triggers, constraints and all the dependencies in one SQL statement
  2. TCP协议学习记录 (一) ICMP时间戳请求
  3. 利用Spring MVC搭建REST Service
  4. SQL Server里简单参数化的痛苦
  5. 做SSH练习的时候,JUunit运行遇到报错信息
  6. 《javascript高级程序设计》 第24章 最佳实践 Best Practices
  7. 实现Linux下的ls -l命令
  8. linux shell 切换到ROOT用户
  9. 使用PHP自动部署GIT代码
  10. C/C++中字符串的输入问题
  11. Node.js初探之实现能向前台返回东西的简单服务器
  12. Python自学编程开发路线图(文中有免费资源)
  13. JS设置、获取和取消Cookie
  14. JavaScript面试技巧(三):开发环境、运行环境
  15. 使用Python访问微信
  16. cxListView和dbgrid联动
  17. telnet限制用户连接数(CentOS)
  18. 2018.12.15 bzoj3676: [Apio2014]回文串(后缀自动机)
  19. 棋盘覆盖问题(算法分析)(Java版)
  20. day 7 引用

热门文章

  1. 前端HTML学习 table标签 知识点与使用
  2. DevOps - 从渐进式交付说起(含实践 Demo)
  3. Java 解析 XML文件
  4. Spring Cloud 系列之 Apollo 配置中心(三)
  5. Java实现 蓝桥杯VIP 算法训练 Car的旅行路线
  6. Java实现 LeetCode 232 用栈实现队列
  7. Java实现 LeetCode 74 搜索二维矩阵
  8. Java实现图形化计算器
  9. 7.keras-模型保存和载入
  10. 【C#】AutoMapper 使用手册