More Effective C++ --- 理解临时对象
2016-11-09 20:10
197 查看
首先理解临时对象的概念
上述中的temp只是函数的一个局部对象,而真正的临时对象时看不见的!
临时对象通常在两种条件下产生。
1.为了使函数调用成功进行隐式转换
2.函数返回对象时
临时对象对程序的性能开销影响很大,必须要关注。
临时对象仅在传值或传递常量型引用时才会产生,对于非常量引用时无法产生的。
即:
另外一种产生临时对象的情况是函数返回对象时,
const Number operator+(const Number& lhs, const Number& rhs);
这个函数的返回值是临时的,因为它没有被命名。对于此类临时对象很难避免,但是我们可以优化:
以以下函数为例:
这是一个临时对象,函数把它拷贝给函数的返回值。
c++规则允许编译器优化不出现的临时对象,因此如果你在以下环境里调用operator*:
编译器会消除此时operator*的临时对象,及调用一个构造函数即可建立对象C,非常高效。
<pre name="code" class="cpp">template<class T> void Swap(T& object1,T& object2) { T temp = object1; object1 = object2; object2 = temp; }
上述中的temp只是函数的一个局部对象,而真正的临时对象时看不见的!
临时对象通常在两种条件下产生。
1.为了使函数调用成功进行隐式转换
2.函数返回对象时
临时对象对程序的性能开销影响很大,必须要关注。
size_t choutChar(const string& str,char ch) char buffer[MAX_STRING_LEN]; char c; countChar(buffer,c);//此时就会产生临时对象
临时对象仅在传值或传递常量型引用时才会产生,对于非常量引用时无法产生的。
即:
void uppercasify(string& str); //此时不会产生临时对象,不会发生隐士转换。仔细思考一下就会明白,此时发生隐式转换会有问题。
另外一种产生临时对象的情况是函数返回对象时,
const Number operator+(const Number& lhs, const Number& rhs);
这个函数的返回值是临时的,因为它没有被命名。对于此类临时对象很难避免,但是我们可以优化:
以以下函数为例:
const Rational operator*(const Rational& lhs, const Rational &rhs);一种推荐的非常高效的方法是返回constructor argument而不是直接返回对象
const Rational operator*(const Rational& lhs,const Rational& rhs) { return Rational(lhs.numerator()*rhs.numerator(), lhs.denominator()* rhs.denominator()); }
这是一个临时对象,函数把它拷贝给函数的返回值。
c++规则允许编译器优化不出现的临时对象,因此如果你在以下环境里调用operator*:
Rational a = 10; Rational b(1,2); Rational c = a * b;
编译器会消除此时operator*的临时对象,及调用一个构造函数即可建立对象C,非常高效。
相关文章推荐
- More Effective C++ ——019_理解临时对象的来源
- 理解临时对象的来源(More Effective C++_19(效率))
- [More Effective C++]条款十九:理解临时对象的来源
- [More Effective C++]条款十九:理解临时对象的来源
- More Effective C++----(19)理解临时对象的来源
- More Effective C++ 条款19 了解临时对象的来源
- more effective c++(临时对象的返回值优化)
- More Effective C++(条款19:了解临时对象的来源)
- 《More Effective C++》学习心得(八) 要求(或禁止)对象产生于heap中
- 理解C++中的临时对象
- More Effective C++ (限制类的对象数量)
- More Effective C++----(8)理解各种不同含义的new和delete
- More Effective C++:理解new和delete
- More Effective C++----(24)理解虚拟函数、多继承、虚继承和RTTI所需的代价
- More Effective C++ 条款27 要求(禁止)对象产生与heap之中
- 《More Effective C++》条款27:如何让类对象只在栈(堆)上分配空间?
- 《MORE EFFECTIVE C++》条款27 要求或者禁止对象分配在堆上
- 《More Effective C++》条款27:如何让类对象只在栈(堆)上分配空间?
- 《more effective c++》条款26 限制类对象的个数
- More Effective C++ 阅读笔记(十二)--怎样限制实例化对象的数量