五分钟小知识:为什么说 ++i 的效率比 i++ 高?

点击蓝色“五分钟学算法”关注我哟

加个“星标”,天天中午 12:15,一起学算法

640?wx_fmt=jpeg

作者 | 守望先生

来源 | 编程珠玑

前言

不知道你是否听说过 ++i 比 i++ 快的说法,真的如此吗?

++i与i++的区别

这两个表达式从我们初学编程语言的时候就会接触到。前者是自增后取值,后者是取值后自增

#include <iostream>
using namespace std;
int main()
{
    int a = 0;
    int b = 0;
    int c = a++;//int tmp = a;c=a;a = a + 1
    int d = ++b;//b = b + 1;d = b;
    cout<<"c="<<c<<";d="<<d<<endl;
    return 0;
}

运行结果:

c=0;d=1  

对于这个结果我们并不感到意外。

另外我们还注意到另外一个有意思的现象:

//来源:公众号【编程珠玑】地址:https://www.yanbinghu.com
#include <iostream>
using namespace std;
int main()
{
    int a = 0;
    int b = 0;
    int *c = &(a++);
    int *d = &(++b);
    return 0;
}

编译后报错:

main.cpp:7:19: error: lvalue required as unary ‘&’ operand
     int *c = &(a++);

说&作用于左值,也就是说a++的结果并非左值。但++b的结果是左值。

可简单理解左值和右值:

  • 左值,有名对象,可赋值

  • 右值,临时对象,不可被赋值

运算符重载

在《

//来源:公众号【编程珠玑】地址:https://www.yanbinghu.com
class Test
{
public:
    Test& operator++();//前置自增
    const Test operator++(int);//后置自增
private:
    int curPos; //当前位置
};
/*前置自增实现范式*/
Test& Test::operator++()
{
    ++curPos;      //自增
    return *this;  //取值
}
/*后置自增实现范式,为了与前置区分开,多了一个int参数,但从来没用过*/
const Test Test::operator++(int)
{
    Test tmp = *this;  //取值
    ++curPos;             //自增
    return tmp;
}

仔细观察后,我们发现前置自增,先自增,后返回原对象的对象;没有产生任何临时对象;而后置自增,先保存原对象,然后自增,最后返回该原临时对象,那么它就需要创建和销毁,这样一来,效率孰高孰低就很清楚了。

在不进行赋值的情况下,内置类型前置和后置自增的汇编都是一样的呢!

void test()
{
  int i = 0;
  i++;
  //++i;
}

汇编:

push    rbp
mov     rbp, rsp
mov     DWORD PTR [rbp-4], 0
add     DWORD PTR [rbp-4], 1
nop
pop     rbp
ret

不过,赋值的情况下,并且不开启编译器优化,它们的汇编代码还是有差别的,有兴趣的可以试试。

总结

对于内置类型,前置和后置自增或者自减在编译器优化的情况下,两者并无多大差别,而对于自定义类型,如无特别需要,人们似乎更加偏爱前置自增或自减,因为后置自增常常会产生临时对象。

但是,又能提高多少效率呢?

640?

有热门推荐?

1.【程序员】

2.【GitHub】

3.【算法】

4.【数据结构】

  • 32
    点赞
  • 81
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
DevOps是一种软件开发和运维的方法论,旨在通过将开发团队和运维团队紧密合作,实现软件开发的快速交付、稳定运行和持续改进。除了CI/CD(持续集成/持续交付)之外,DevOps还包括以下几个重要方面: 1. 自动化:自动化是DevOps的核心原则之一。它涵盖了自动化构建、部署、测试和监控等过程,以减少人工操作带来的错误和延迟,提效率和质量。 2. 配置管理:通过使用配置管理工具(如Ansible、Chef、Puppet等),可以对服务器和基础设施进行版本控制、自动化部署和一致性管理,确保环境的可重复性和稳定性。 3. 容器化:使用容器技术(如Docker、Kubernetes等)可以将应用程序及其依赖项打包成独立、可移植的容器,实现快速部署、扩展和管理。 4. 监控与日志:通过实时监控系统性能、应用程序运行状态以及收集日志信息,可以及时发现和解决问题,确保系统的可靠性和稳定性。 5. 协作与文化:DevOps强调开发人员、运维人员和其他相关团队之间的紧密协作,促进信息共享、知识传递和问题解决。此外,它还强调持续学习和改进的文化,鼓励团队成员不断探索新技术和最佳实践。 综上所述,DevOps不仅仅局限于CI/CD,还包括自动化、配置管理、容器化、监控与日志以及协作与文化等方面。这些原则和实践的结合,可以帮助组织实现快速交付质量软件的目标。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值