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

  • 相关阅读:
    Python解析Yahoo的XML格式的天气预报数据
    如何卸载wineQQ?
    纪念我的第一篇
    hihocoder1062 最近公共祖先·一
    hihocoder1055 刷油漆(树形DP)
    hihocoder1050 树中的最长路径
    hihocoder1049 根据二叉树的先序序列和中序序列求后序序列
    hihocoder1044 状态压缩
    hihocoder1043 完全背包
    hihocoder1038 01背包
  • 原文地址:https://www.cnblogs.com/fenggwsx/p/13191050.html
Copyright © 2020-2023  润新知