C++中看不见的临时对象

        面向对象的编程语言中涉及到对象的创建与销毁,其中有构造函数与析构函数的调用,在创建对象、值拷贝对象等过程中,编译器会隐含创建一些源码中没有的临时对象,如果不注意,这些临时对象会给程序的性能带来很大的影响。下面介绍二种常见的临时对象产生环境并给出解决方案:

1、当函数返回一个对象时,一般情况下会出现临时变量
class A
{
    public:
        A& operator = (const A& a);
        friend const A operator+(const A& a1, const A& a2);
}
const A operator+(const A& a1, const A& a2)
{
    A temp;
    ......
    return temp;
}

void main(void)
{
    A a1, a2, a;
    a = a1+a2;
}
分析:a1+a2返回时,其中的temp已经结束了其生命周期,返回的A对象需要在调用a1+a2函数的栈中开辟空间来存放此返回值,这个临时的A对象是a1+a2返回时通过A拷贝构造函数。在main函数中可以通过A a = a1+a2;来避免产生临时对象。此时这句是初始化操作,不需要在main空间栈中开辟空间,而是直接使用为a预留的空间。这里有一条规则:对非内建对象,尽量将对象的定义延迟到已经确切知道其有效状态时,以减少临时对象的生成。


2、当实际调用函数传入的参数和函数定义中声明变量类型不匹配时,会出现临时变量
class A
{
    public:
        A(int x=0, int y=1): m(x), n(y){}
    private:
        int m,n;
};
void func()
{
    A a;
    a = 10;
    ......
}
a=1此处看似无法通过编译,但是C++编译器在判定这种语句不能成功编译前,会做各种尝试找到合适转换路径,以满足编译要求。以是代码中编译器会将1通过调用A::A(10, 1)生成一个临时对象赋值给a。这种情况可以在构造函数前加上explicit声明强制开发人员显式地根据构造函数定义调用,而不能做隐式处理。

另外,关于C++某些运算符的效率问题,比如+=、-=、*=、/=、%=,拿+=为例:
......

A & operator+=(const A & a1)

{
    m+=a1.m;
    n+=a1.n;
    return (*this);
}

......

void main(void)

{
A a1, a2, a;

a += a1;     // 并没有产生临时对象

        a = a+a1;   // 会产生临时对象

        ......

}

对于前置单目运算符++、--同样也不会产生临时对象,而后置++、--则会出现临时对象。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值