加载中

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

posted @ 2020-06-25 09:08  fenggwsx  阅读(985)  评论(0编辑  收藏  举报