C++中i++和++i的区别
2024-08-30 18:07:27
效果上的区别
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++中的类(对象),因为++
作为后缀需要产生一个新的临时对象,但是++
作为前缀将不会产生该问题。
最新文章
- Drop all the tables, stored procedures, triggers, constraints and all the dependencies in one SQL statement
- TCP协议学习记录 (一) ICMP时间戳请求
- 利用Spring MVC搭建REST Service
- SQL Server里简单参数化的痛苦
- 做SSH练习的时候,JUunit运行遇到报错信息
- 《javascript高级程序设计》 第24章 最佳实践 Best Practices
- 实现Linux下的ls -l命令
- linux shell 切换到ROOT用户
- 使用PHP自动部署GIT代码
- C/C++中字符串的输入问题
- Node.js初探之实现能向前台返回东西的简单服务器
- Python自学编程开发路线图(文中有免费资源)
- JS设置、获取和取消Cookie
- JavaScript面试技巧(三):开发环境、运行环境
- 使用Python访问微信
- cxListView和dbgrid联动
- telnet限制用户连接数(CentOS)
- 2018.12.15 bzoj3676: [Apio2014]回文串(后缀自动机)
- 棋盘覆盖问题(算法分析)(Java版)
- day 7 引用