条款26:尽可能延后变量定义的出现时间

本文探讨了C++代码中对象构造与析构的效率问题,建议在可能的情况下延迟对象的定义以避免不必要的构造和析构成本。同时,对比了在循环中对象定义的位置对性能的影响,指出当赋值操作成本低于构造和析构时,循环内部定义对象可能是更优的选择。讨论了如何在效率和资源使用之间找到平衡,以提升代码性能。
摘要由CSDN通过智能技术生成

考虑如下代码

std::string encryptPasswd(const std::string& passwd) {
	using namespace std;
	string encrypted;
	if (password.length() >  MinimumPasswordLength) {
		throw logic_error("Passwd is too short");
	}
	// ...
	return encryted;
}

上述函数中的encrypted对象未完全使用,当encryptPasswd丢出异常时,仍需要付出encrypted的构造和析构成本,所以最好延后encrypted的定义式,如下:

std::string encryptPasswd(const std::string& passwd) {
	using namespace std;	
	if (password.length() >  MinimumPasswordLength) {
		throw logic_error("Passwd is too short");
	}
	// ...
	string encrypted;
	return encryted;
}

但是上述代码仍然不够好,因为encrypted虽获定义却无任何实参作为初值,这意味着调用的是其default构造函数,条款4曾解释:“通过default构造函数构造出一个对象然后对它赋值比[直接在构造时指定初值]效率差”

但是遇到循环时候怎么办?考虑如下代码:

// 形式A:定义于循环外
Widget w;
for (int i = 0; i < n; i++) {
	w = 取决于i的某个值;
	// ...
}

// 形式B:定义于循环内
for (int i = 0; i < n; i++) {
	Widget w(取决于i的某个值);
	// ...
}

做法A:1个构造函数 + 1个析构函数 + n个赋值操作
做法B:1个构造函数 + 1个析构函数

如果classes的一个赋值成本低于一组构造+析构函数,做法A大体而言比较高效,尤其n很大的时候,否则做法B或许比较好;

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值