关于 前++ 和 后++ 的效率问题

本文澄清了关于++i和i++效率的常见误解,对于内置数据类型,现代编译器使得两者并无差别。然而,对于自定义数据类型,前置++在效率上优于后置++,因为后者涉及额外的对象创建。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

  我在写这篇博客之前也是被一些文章所误导,认为 ++i 的效率比 i++ 的效率高,每次都是使用前置的 ++。虽然操作没错,但是在认识上有错误,所以我把自己错误认识的经历分享出来,希望能够对和我有同样错误的人一些帮助。

一、内置数据类型

  对于计算机内置的数据类型,现在的编译器水平比较高,比如 ++ii++ 没有任何的区别,我们可以通过查看汇编代码看出来。

  • C语言源代码如下:
    i++;   // 后置的++
    ++i;   // 前置的++
    i = i + 1;
    
  • 汇编代码如下:
    0x401366	addl   $0x1,0xc(%esp)   // i++;
    0x40136b	addl   $0x1,0xc(%esp)   // ++i;
    0x401370	addl   $0x1,0xc(%esp)   // i = i + 1;
    

  通过观察编译的结果,我们发现这三条语句的汇编代码没有任何的差异,但是我用的编译器是 Code::blocks,你也可以试用其他的编译器,比如Visual Studio Code 或者 VC++ 都可以,应该都是一样的。

二、自定义数据类型

  对于自定义数据类型,前 ++ 要高于后 ++ 。简单的说,在 C++ 中 i++ 在实现的时候会生产一个类对象,例如:

  • i++ :
    INT INT::operator++()
    {
    	*this = *this + 1;
    	return *this;
    }
    
  • ++i :
    INT INT::operator++()
    {
    	INT val = *this;   // 此时会产生一个类对象
    	*this = *this + 1;
    	return val;
    }
    

  如果有错误的地方也请各位朋友在评论区指出,我们互相学习。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值