只要你定义了一个变量而其类型带有一个构造函数和析构函数,你就要承受构造和析构成本。有时这个变量最终并未被使用,这就是一种浪费了。你可能会说我不可能定义一个不使用的变量。哈哈 看看下面的代码例子,有时这种不使用不是由你故意造成的。
有一个计算通行密码的加密版本而后返回,前提是密码够长,否则函数会抛出一个异常。如下:
//这个函数过早定义变量"encrypted"
std::string encryptPassword(const std::string& password)
{
using namespace std;
string encrypted;
if(password.length() < MinimunPasswordLength)
{ throw logic_err("Password is Too Short"); }
..... //必要的动作,能将一个加密后的密码置入变量encrypted内
return encrypted;
}
问题出在如果代码抛出异常,则encrypted没有完全的被使用,可是你还是会付出构造和析构成本。所以最好是延后变量的定义式,直到确实需要它。如下:
//延后了encrypted的定义式
std::string encryptPassword(const std::string& password)
{
using namespace std;
if(password.length() < MinimunPasswordLength)
{ throw logic_err("Password is Too Short"); }
string encrypted; //延后定义了
..... //必要的动作,能将一个加密后的密码置入变量encrypted内
return encrypted;
}
上面的代码还是有问题,就是在encrypted定义时使用了default构造函数,因为encrypted虽然获定义却无任何实参作为初值,这样下面你还要给它赋初值。这就是一种浪费了。更受欢迎的做法是以password作为encrypted的初值,跳过毫无意义的default构造函数,如下:
//这是定义初始化encrypted最佳的方法
std::string encryptPassword(const std::string& password)
{
..... //和前面一样
string encrypted(password); //使用了copy构造函数定义并初始化
..... //必要的动作,能将一个加密后的密码置入变量encrypted内
return encrypted;
}
本条款“尽可能延后“的真正意义:不只应该延后变量的定义,直到非使用该变量的前一刻为止,甚至应该尝试延后这份定义直到能够给它初值实参为止。这样不仅能够避免构造和析构非必要对象,还可以避免无意义的default构造行为。
总结:
尽可能延后变量定义式的出现,这样做可增加程序的清晰度并改善程序效率
Effective C++读书笔记之尽量延后变量定义式的出现时间
最新推荐文章于 2024-03-12 23:01:13 发布