• ++前置,后置++ 汇编角度效率比较


    测试环境:VS2015

    内置类型(int举例):

    1 int a=0,i=0;
    2 a = i++;
    3 a = ++i;
     1     int a=0,i=0;
     2 00921DAB  mov         dword ptr [a],0  
     3 00921DB5  mov         dword ptr [i],0  
     4     a = i++;
     5 00921DBF  mov         eax,dword ptr [i]  
     6 00921DC5  mov         dword ptr [a],eax  
     7 00921DCB  mov         ecx,dword ptr [i]  
     8 00921DD1  add         ecx,1  
     9 00921DD4  mov         dword ptr [i],ecx  
    10     a = ++i;
    11 00921DDA  mov         edx,dword ptr [i]  
    12 00921DE0  add         edx,1  
    13 00921DE3  mov         dword ptr [i],edx  
    14 00921DE9  mov         eax,dword ptr [i]  
    15 00921DEF  mov         dword ptr [a],eax 

    后置++i和i++的+1操作的执行顺序的不同,效率几乎无区别

    i++将i的值赋值到eax寄存器中,然后在将eax寄存器的值赋值到变量a所在的内存地址中,然后再讲i的值赋值到ecx,执行ecx+1,加1后再重新对i的赋值为ecx.

    ++i将i的值赋值到edx寄存器中,然后再将edx直接加1,然后赋值给i,i此时已经+1,固需要利用eax对a的内存进行赋值为i.

    非内置类型(举例):

     1 class Test
     2 {
     3 public:
     4     Test() :a(5) {}
     5     Test& operator ++()
     6     {
     7         ++a;
     8         return *this;
     9     }
    10     const Test operator++(int)
    11     {
    12         Test oldTest = *this;
    13         ++a;
    14         return oldTest;
    15     }
    16 private:
    17     int a;
    18 };
    19 int main(int argc, char *argv[])
    20 {
    21     int a=0,i=0;
    22     a = i++;
    23     a = ++i;
    24     Test test;
    25     ++test;
    26     test++;
    27 }
     1     Test test;
     2 00D81DF5  lea         ecx,[test]  
     3 00D81DFB  call        Test::Test (0D82050h)  
     4     ++test;
     5 00D81E00  lea         ecx,[test]  
     6 00D81E06  call        Test::operator++ (0D82160h)  
     7     test++;
     8 00D81E0B  push        0  
     9     test++;
    10 00D81E0D  lea         ecx,[ebp-19Ch]  
    11 00D81E13  push        ecx  
    12 00D81E14  lea         ecx,[test]  
    13 00D81E1A  call        Test::operator++ (0D82130h)  
     1     Test& operator ++()
     2     {
     3 00D82160  push        ebp  
     4 00D82161  mov         ebp,esp  
     5 00D82163  push        ecx  
     6 00D82164  mov         dword ptr [this],ecx  
     7         ++a;
     8 00D82167  mov         eax,dword ptr [this]  
     9         ++a;
    10 00D8216A  mov         ecx,dword ptr [eax]  
    11 00D8216C  add         ecx,1  
    12 00D8216F  mov         edx,dword ptr [this]  
    13 00D82172  mov         dword ptr [edx],ecx  
    14         return *this;
    15 00D82174  mov         eax,dword ptr [this]  
    16     }
    17 00D82177  mov         esp,ebp  
    18 00D82179  pop         ebp  
    19 00D8217A  ret  
     1     const Test operator++(int)
     2     {
     3 00D82130  push        ebp  
     4 00D82131  mov         ebp,esp  
     5 00D82133  sub         esp,8  
     6 00D82136  mov         dword ptr [this],ecx  
     7         Test oldTest = *this;
     8 00D82139  mov         eax,dword ptr [this]  
     9         Test oldTest = *this;
    10 00D8213C  mov         ecx,dword ptr [eax]  
    11 00D8213E  mov         dword ptr [oldTest],ecx  
    12         ++a;
    13 00D82141  mov         edx,dword ptr [this]  
    14 00D82144  mov         eax,dword ptr [edx]  
    15 00D82146  add         eax,1  
    16 00D82149  mov         ecx,dword ptr [this]  
    17 00D8214C  mov         dword ptr [ecx],eax  
    18         return oldTest;
    19 00D8214E  mov         edx,dword ptr [ebp+8]  
    20 00D82151  mov         eax,dword ptr [oldTest]  
    21 00D82154  mov         dword ptr [edx],eax  
    22 00D82156  mov         eax,dword ptr [ebp+8]  
    23     }
    24 00D82159  mov         esp,ebp  
    25 00D8215B  pop         ebp  
    26 00D8215C  ret         8  

    对于非内置类型,显然后置++要需要更多的效率开销。

  • 相关阅读:
    生成函数trick
    带权并查集维护二分图
    关于二项式反演的一些思考
    CSP集训记录
    解决Maven版本冲突
    蚂蚁金服5轮面试,最后栽这了...
    配置交换机Eth-Trunk+VRRP+MSTP+接口BFD状态联动+Telnet示例
    企业园区网络建设技术方案(华为)
    网络三层架构
    SOA治理
  • 原文地址:https://www.cnblogs.com/Forever-Kenlen-Ja/p/7080151.html
Copyright © 2020-2023  润新知