C++对传参和传返回值时构造的N中优化处理

系统在什么情况在会进行优化呢?

1. 当拷贝构造存在连续赋值的情况的时候
2. 当多个临时对象连续赋值的时候,【简单来说就是就是,再一次拷贝构造结束后,并没有直接返回要创建的对象,而是再一次进行了拷贝构造,或者建立一个临时对象,来进行拷贝构造,然后又返回一个临时对象,在用这个返回的临时对象继续拷贝构造,这是就会优化】
3. 匿名对象的优化。

再有临时变量的地方,拷贝会优化,超出一个表达式,是不会优化的。


#include<iostream>
using namespace std;

class Date
{ 
public :
    Date()
    {
        cout<<"Date()" <<endl;
    }

    Date(const Date& d)
    {
        cout<<"Date(const Date& d)" <<endl;
    }

    Date& operator =(const Date& d )
    {
        cout<<"Date& operator=(const Date& d)"<< endl;
        return *this ;
    }

    ~Date()
    {
        cout<<"~Date()" <<endl;
    }
};

// 1.Date 对象做参数传值 & 传引用
void fun1 (Date d) 
{}

//void fun1(Date& d)
//{}

// 2.Date 对象做返回值传值 & 传引用
Date fun2 () 
{
    Date d ;
    return d ;
} 

//Date& fun2()
//{
//  Date d ;
//  return d ;
//}

// 3.Date 对象做临时返回值传值 &传引用(编译器优化问题)
Date fun3 () 
{
    return Date ();
}

//Date& fun3()
//{
//  return Date ();
//}

void Test1()
{
    Date d1;
    fun1(d1);
}

void Test2()
{
    Date d2 = fun2();
}

void Test3()
{
    Date d3;
    d3 = fun3();
}

test1

tset2

tst3

class AA
{};
AA f (AA a)
{
return a ;
}
void Test1 ()
{
AA a1 ;
a1 = f(a1);
}
void Test2 ()
{
AA a1 ;
AA a2 = f(a1);
}

void Test3 ()
{
AA a1 ;
AA a2 = f(f(a1));
}
Test1中调用了_2__次AA的拷贝构造函数,_1__次AA的赋值运算符函数的重载。
Test2中调用了__2_次AA的拷贝构造函数,__0_次AA的赋值运算符函数的重载。
Test3中调用了_3__次AA的拷贝构造函数,_0__次AA的赋值运算符函数的重载。

这里写图片描述
这里写图片描述
这里写图片描述

猜你喜欢

转载自blog.csdn.net/niukeming/article/details/79837375