你知道吗?对于连续的”构造+拷贝构造“,编译器其实是会默默做出优化的。👻
如果你不知道这个知识点的话,那下面这道笔试题就要失分了😵。
本篇分享一个关于编译器优化的小知识,看完本篇,你就能知道程序里的 构造函数、拷贝构造函数 究竟被调了几次~
题目引入
某笔试题:下面的程序经历了几次构造?几次拷贝构造?
答案为:
1次构造,4次拷贝
对此题的分析在本篇末尾。如果你对这道题尚有存疑,那相信看完本篇,你的疑惑将会烟消云散~👻
传值传参 的优化
我们知道,传值传参会产生拷贝,因为这样能保证 函数内部对参数的操作 不会影响到原始变量的值。
➡️先看一个没做优化的例子:
class W
{
public:
//构造函数
W(int w)
:_w(w)
{
cout << "W()" << endl;
}
//拷贝构造函数
W(const W& w)
:_w(w._w)
{
cout << "W(const W& w)" << endl;
}
//析构函数
~W(){
cout << "~W()" << endl;
}
private:
int _w;
};
void func(const W w) {
}
int main()
{
W w1=1; //构造
func(w1); //拷贝构造:把w1的值拷贝一份,传到形参
return 0;
}
调用情况我们打印出来: