Effective C++条款26:尽可能延后变量定义式的出现时间.

本文探讨了Effective C++中的条款26,建议尽可能延后变量的定义,以避免不必要的构造和析构成本。通过实例分析,解释了延迟定义可以提高程序效率,尤其是在涉及可能的异常、默认构造函数和赋值操作时。同时,指出在循环中,根据构造和析构的相对成本选择合适的方法,并强调延后定义可以提升程序的可读性和维护性。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

考虑下面函数:

std::string encryptPassword(const std::string & password)
{
	using namespace std;
	string encrypted;
	if(password.length() < MinimumPasswordLength)
	{
		throw logic_error("Password is too short");
	}
	...
	return encrypted;
}

如果有异常抛出,encrypted就完全没有被使用,此时你仍得付出encrypted的构造成本和析构成本。所以最好延后encrypted的定义式,直到确实需要它:

std::string encryptPassword(const std::string & password)
{
	using namespace std;
	if(password.length() < MinimumPasswordLength)
	{
		throw logic_error("Password is too short");
	}
	string encrypted;
	...
	return encrypted;
}

但是这段代码还有个问题,encrypted虽然定义了却没有任何实参作为初值,这意味着调用的是其默认构造函数,条款4已经说过了,使用默认构造函数出一个对象然后对它赋值效率比较差。
更好的做法是:以password作为encrypted的初值,跳过毫无意义的默认构造过程

std::string encryptPassword(const std::string & password)
{
	using namespace std;
	if(password.length() < MinimumPasswordLength)
	{
		throw logic_error("Password is too short");
	}
	string encrypted(password);
	...
	return encrypted;
}

尽可能延后的真正意义是:你不应该只延后变量的定义,直到非得使用该变量的前一刻为止,甚至应该尝试延后这份定义知道能够给它初值实参为止。

但是循环怎么办?
考虑下面两个结构,哪一个比较好?

//做法A
Student A;
for(int i = 0; i < n; ++i)
{
	A = i的某个值
	...;
}
//做法B
for(int i = 0; i < n; ++i)
{
	Student  A(i的某个值);
}

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

如果赋值操作低于构造和析构成本,A比较好,尤其当n比较大的时候,否则做法B可能会更好。
此外做法A造成w的作用域比做法B更大,有时会对程序的可理解性和易维护性造成冲突.

总结:

尽可能延后变量定义式的出现,这样做可增加程序的清晰度并改善程序效率

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值