i++ 与 ++i 的效率

结论:

内建类型的情况下,效果一致:

自建类型下, 前缀表达式  ++i  效率 高于后缀表达式 i++。  (STL中 iterator 采用 ++i 这种前缀表达式)

 

过程:

我才用DEV C++ 5.9.2 的编译器查看反汇编代码。 (编译器应该做了优化,我判断不出来) 。代码段2 是代码段1 的汇编代码。 注释是我单步调试时,每段代码的对应汇编代码。

 

1. 自建类型下,汇编的操作 区别不大。(不考虑编译器优化的情况下)

单独自加时,是一致的;存在赋值的情况下,优化后,前缀表达式略高,不考虑优化,近乎一致。 多了临时变量

#include <stdio.h>
        
 int main()
{
  int i = 0;
  int x = 0;
        
  i++;
  ++i;
  x = i++;
  x = ++i;
        
   return 0;
 }
   0x00000000004014f0 <+0>:	push   rbp
   0x00000000004014f1 <+1>:	mov    rbp,rsp
   0x00000000004014f4 <+4>:	sub    rsp,0x30
   0x00000000004014f8 <+8>:	call   0x402330 <__main>
   0x00000000004014fd <+13>:	mov    DWORD PTR [rbp-0x4],0x0
   0x0000000000401504 <+20>:	mov    DWORD PTR [rbp-0x8],0x0
   0x000000000040150b <+27>:	add    DWORD PTR [rbp-0x4],0x1  //i++;
   0x000000000040150f <+31>:	add    DWORD PTR [rbp-0x4],0x1     //++i;
   0x0000000000401513 <+35>:	mov    eax,DWORD PTR [rbp-0x4]  // x=i++;
   0x0000000000401516 <+38>:	lea    edx,[rax+0x1]            // x=i++;
   0x0000000000401519 <+41>:	mov    DWORD PTR [rbp-0x4],edx  // x=i++;
   0x000000000040151c <+44>:	mov    DWORD PTR [rbp-0x8],eax  // x=i++;
   0x000000000040151f <+47>:	add    DWORD PTR [rbp-0x4],0x1     // x=i++;
   0x0000000000401523 <+51>:	mov    eax,DWORD PTR [rbp-0x4]     // x=i++;
   0x0000000000401526 <+54>:	mov    DWORD PTR [rbp-0x8],eax     // x=i++;
=> 0x0000000000401529 <+57>:	mov    eax,0x0
   0x000000000040152e <+62>:	add    rsp,0x30
   0x0000000000401532 <+66>:	pop    rbp
   0x0000000000401533 <+67>:	ret    

2. 自建类型下 : 前缀表达式高于后缀表达式 

从上面代码可以看出,后置++多了一个保存临时对象的操作,因此效率自然低一些。

Operator Operator::operator++()
{
++value; //内部成员变量
return *this;
}
 
Operator Operator::operator++(int)
{
Operator temp;
temp.value=value;
value++;
return temp;
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值