系统在什么情况在会进行优化呢?
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();
}
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的赋值运算符函数的重载。