C++学习(二十八)性能优化提升

本文介绍了C++性能优化的几个关键点,包括减少临时变量的使用,避免隐式类型转换,减少内存频繁申请和释放。详细讨论了函数实参、函数返回值、隐式类型转换和多余拷贝的情况,并给出了优化建议,如使用引用传递、优化返回值优化、避免不必要的拷贝等。
摘要由CSDN通过智能技术生成

1、减少临时变量

2、减少 Implicit conversion (隐式转换)

3、减少频繁的内存申请、释放

 

转载自:http://www.708luo.com/?p=33

临时变量

目前遇到的一些产生临时变量的情况:函数实参、函数返回值、隐式类型转换、多余的拷贝

1. 函数实参

这点应该比较容易理解,函数参数,如果是实参传递的话,函数体里的修改并不会影响调用时传入的参数的值。那么函数体里操作的对象肯定是函数调用的过程中产生出来的。

那么这种情况我们该怎么办呢?

如果callee中确实要修改这个对象,但是caller又不想callee的修改影响到原来的值,那么这个临时变量就是必须的了,不需要也没办法避免。

如果callee中根本没有修改这个对象,或者callee中这个参数本身就是const型的,那么将实参传递改为引用传递是个不错的选择(如果是基本类型的函数实参,则没有必要改为引用),可以减少一个临时变量而且不会带来任何损失。

另外,推荐一个静态代码检查工具cppcheck,这个工具可以提示非基本类型的const实参改为引用。

2. 函数返回值(返回对象)

函数返回值的情况比较复杂,因为编译器在这方面做了很多优化,编译器优化到何种程度我也没追根究底研究过。

前面有篇文章中就提到了,在没开任何优化选项的时候,gcc也优化了一些简单的返回对象的情况。

先看一段代码:

1

2

3

4

5

6

A createA(int a)

{

    A tmp; 

    tmp._a=a;

    return tmp;

}

抛开所有优化不谈,函数中createA应该有一个构造操作(tmp对象生成)和一个拷贝构造操作(tmp对象返回时)。

于是有些编译器尝试对函数返回时的拷贝构造进行优化:

1

2

3

4

A createA(int a)

{

    return A(a);

}

第一步可以被优化的拷贝构造就是上面的这种情况,即RVO(return value optimization),这时候只能在函数返回一个未命名变量的时候进行优化。

后来更进一步,可以在函数返回命名变量的时候也进行优化了,这就是NRVO(named return value optimization)。

但是这时候,还有一种情况不能优化的情况是:如果createA函数内部不同的分支返回不同的对象

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

A createA(int a)

{

    if(a%2==0)

    {

        A tmp; 

        tmp._a = 2

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值