Effective C++ (E3 26)笔记之延后变量定义的时间

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/brahmsjiang/article/details/79114031

如果定义一个变量并且需要承受其构造和析构成本,那么应尽量直到使用该变量的前一个时刻才将其定义。若是提前定义而最终未使用该变量,则耗费构造、析构成本不可避免。

有个加密password的函数,返回加密后password的字符串,见示例:

std::string encryptPswd(const std::string& pswd)
{
	if(pswd.length() < minpasswd){
		throw logic_error("encrpt err");
	}
	std::string tmp(pswd);
	tmp+="xxxxx";
	return tmp;
}

在此定义string tmp是个较为恰当的做法。

首先延后了使用到的tmp的定义式。若检查参数有效性时抛出了异常,可能导致程序走不到tmp的定义式,也就不用额外构造析构string对象了。

其次对string类对象直接构造时指定初值,而不是通过default构造函数构造出对象然后对其赋值。两种构造方式,前者是“构造”而后者是“构造+赋值”,前者效率更高。


若是循环,是定义于循环体外并在每次循环迭代时赋值(A),还是定义于循环体内(B)?两种成本如下:

做法A:1构造+1析构+n赋值
做法B:n构造+n析构

如果此类型的一个赋值操作低于一组构造+析构成本,尤其当n很大时,做法A较高效。而做法A会使得对象的作用域更大,不便于维护和理解,因此除上述以外情况,应该使用做法B。

展开阅读全文

没有更多推荐了,返回首页