标签:优化 一个 临时对象 编译 span fun pre acl 重载
C++Primer作者提到拷贝构造函数调用的三种时机:
1. 当用一个类对象去初始化另外一个类对象(类似于 AClass aInstance = bInstance),这里不是调用赋值构造函数(也叫赋值重载运算符)。复制是说初始化,赋值是初始化后重新覆盖旧值
2.函数形参是类对象
3.函数返回值为对象,函数执行完返回时会生成一个临时对象,将值复制给临时对象
但是下列代码验证时发现 第三个返回值是对象时并没有调用拷贝构造函数
class ZooAnimal
{
public:
ZooAnimal() : loc (1){}
ZooAnimal(const ZooAnimal &lhs) {
this->loc = lhs.loc;
cout << "copy construct" << endl;
}
virtual ~ZooAnimal() { cout << "deconstructer" << endl; }
virtual void rotate()
{
cout << "ZooAnimal" << endl;
cout << loc << endl;
}
public:
int loc;
string name;
};
ZooAnimal func()
{
ZooAnimal x;
x,loc = 2;
return x;
}
int main(int argc, char* argv[])
{
func();
return 0;
}
原因是在C++Primer的作者在《深度探索C++对象模型》一书中提到,编译器会进行优化,返回值在参数采用引用的方式
func优化为 ZooAnimal func(ZooAnimal &_hiddenArg) { hiddenArg.loc =1; return; }
g++ main.cpp -o test -fno-elide-constructors 可关闭优化
结果打印
copy construct
标签:优化 一个 临时对象 编译 span fun pre acl 重载
原文地址:https://www.cnblogs.com/dj0325/p/12013385.html