【入门C++编程的艺术】构造函数和析构函数的优化问题

文章讨论了C++中编译器对连续构造表达式的优化,以及单参数构造函数赋值和传参返回值的优化情况。Linux下的g++在默认设置下进行了更激进的优化,而VS和VS下release模式则限制在特定次数的拷贝构造。
摘要由CSDN通过智能技术生成

💛不要有太大压力🧡
💛生活不是选择而是热爱🧡

在这里插入图片描述

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;
}

打印结果:
![[Pasted image 20220910164352.png]]

即:只构造了一次
本来会先构造一个匿名对象
然后再拷贝构造一个形参对象
这里是编译器对与不必要步骤的优化
注意这里必须是在同一个步骤(表达式)中的连续构造的情况才会优化
合二为一

g++和VS都支持的

2. 单参数的构造函数赋值时的优化

int main()
{
	W w2 = 1;
}

先利用int类型构造一个临时对象
然后再用临时对象拷贝构造出w2

编译器优化为: 直接构造出w2

3. 传参+返回值的优化

![[构造和拷贝构造的优化 1.png]]

上面的第一个题(左):1次构造,4次拷贝构造
第二个题(右):1次构造,7次拷贝构造

Linux下取消优化:第二个题拷贝构造9次

如何取消优化:
因为Linux下 默认是64位+release环境,拷贝构造5次

Linux现在g++整体是偏激进优化的和vs下release下一样都是优化到5次,中间冗余对象也优化了 debug下也是

通过加参数-fno-elide-constructors
g++下面可以看到完全关闭优化的本来次数
✨感谢阅读~ ✨
❤️码字不易,给个赞吧~❤️

在这里插入图片描述

  • 16
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值