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

  • 相关阅读:
    JavaWeb--JDBC
    JavaWeb--过滤器、监听器
    Javaweb-MVC三层架构
    JavaWeb--JSP
    JavaWeb--Cookie、Session
    JavaWeb--Servlet
    实用记录文档
    分库分表Sharding-JDBC + MyBatis-Plus动态表名
    如何不靠运气变得富有 (九) —— 互联网极大地丰富了职业发展的可能性
    如何不靠运气变得富有 (八) —— 给社会提供它不知道如何获得的东西
  • 原文地址:https://www.cnblogs.com/fenggwsx/p/13191050.html
Copyright © 2011-2022 走看看