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 |
|
抛开所有优化不谈,函数中createA应该有一个构造操作(tmp对象生成)和一个拷贝构造操作(tmp对象返回时)。
于是有些编译器尝试对函数返回时的拷贝构造进行优化:
1 2 3 4 |
|
第一步可以被优化的拷贝构造就是上面的这种情况,即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 |
|