💛不要有太大压力🧡
💛生活不是选择而是热爱🧡
1. 连续的一个表达式中的连续构造会被优化(只传参)
//有一个W类
class W
{
public:
//构造
W(int x = 0)
{
cout << "W()" << endl;
}
//拷贝构造
W(const W& w)
{
cout << "W(const W& w)" << endl;
}
//析构
~W()
{
cout << "~W()" << endl;
}
};
//
void f1(W w)
{
}
void f2(const W& w)
{
}
int main()
{
f1(W());// 本应该是:匿名构造 + 拷贝构造
// 经过编译器优化:直接构造
return 0;
}
打印结果:
即:只构造了一次
本来会先构造一个匿名对象
然后再拷贝构造一个形参对象
这里是编译器对与不必要步骤的优化
注意这里必须是在同一个步骤(表达式)中的连续构造的情况才会优化
合二为一
g++和VS都支持的
2. 单参数的构造函数赋值时的优化
int main()
{
W w2 = 1;
}
先利用int类型构造一个临时对象
然后再用临时对象拷贝构造出w2
编译器优化为: 直接构造出w2
3. 传参+返回值的优化
上面的第一个题(左):1次构造,4次拷贝构造
第二个题(右):1次构造,7次拷贝构造
Linux下取消优化:第二个题拷贝构造9次
如何取消优化:
因为Linux下 默认是64位+release环境,拷贝构造5次
Linux现在g++整体是偏激进优化的和vs下release下一样都是优化到5次,中间冗余对象也优化了 debug下也是
通过加参数-fno-elide-constructors
g++下面可以看到完全关闭优化的本来次数
✨感谢阅读~ ✨
❤️码字不易,给个赞吧~❤️