More Effective 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,非常高效。


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值