对象优化及右值引用优化
对象的函数调用时机
class Test {
public:
Test(int val = 0) :val_(val) {
cout << "Test::Test" << endl;
}
~Test()
{
cout << "Test::~Test" << endl;
}
Test(const Test& test)
{
cout << "Test::Test(const Test& test)" << endl;
val_ = test.val_;
}
Test& operator=(const Test& test)
{
cout << "Test::operator=(const Test& test)" << endl;
if (this == &test)
return *this;
val_ = test.val_;
return *this;
}
private:
int val_;
};
构造函数的调用
Test t1;
Test t4 = Test(1); // Test(1)显示生成临时对象,生存周期:当前所在语句除了语句就析构。使用临时对象
- Test t4 = Test(1) 被优化成Test t4(1)
- Test(1)会产生一个临时对象,当出该语句的时候就析构该对象
拷贝构造函数的调用
Test t2(t1);
Test t3 = t1;
- 产生一个新对象的时候使用对象对其初始化,调用拷贝构造
赋值函数调用
t2 = t4;
t1 = Test(1); // 显式临时对象的生成
t2 = (Test)1; // 显式临时对象的生成
t3 = 30; // 隐式临时对象的生成
- 对已经存在的对象进行赋值的时候,调用赋值函数
引用临时对象
const Test& ref = Test(20);
//Test* p = &Test(10); // &后面接临时变量时不能取地址
- 相当于为临时对象起了个别名,对象的生存周期延长
- 临时对象不能使用&取地址
局部静态对象的构造函数调用时机
- 最先在数据区为其开辟内存空间
- 只要有在运行到该对象的构造函数调用点,才会调用该对象构造函数
- 程序结束时,才调用该对象析构函数
RVO优化
G++ 编译器,在函数返回对象时候会将创建的临时变量优化掉,导致不会调用对应的拷贝构造函数。g++编译的时候可以使用下面命令关闭掉RVO优化,
-fno-elide-constructors
标签:调用,对象,Test,引用,及右值,临时,优化,构造函数
From: https://blog.csdn.net/weixin_43459437/article/details/143591112