定义一个带有构造函数和析构函数类型的变量,当程序执行到变量的定义式时,构造函数便会被执行,当变量离开作用域时,析构函数便会被执行。即使这个变量从未被使用,比如如下代码:
std::string encrypt_password(const std::string& password) {
std::string encrypted;
if (password.size() < min_size) {
throw logic_error("password is too short");
}
...
return encrypted;
}
该函数用来加密密码,前提是密码达到一定长度,当密码过短则抛出异常。然而,上述代码过早定义变量 encrypted,当密码过短时,仍然执行了string类的构造函数和析构函数,产生了不必要的成本。为避免不必要的构造和析构成本,函数可实现如下:
std::string encrypt_password(const std::string& password) {
if (password.size() < min_size) {
throw logic_error("password is too short");
}
std:: string encrypted(password);
...
return encrypted;
}
”但循环怎么办?“,当变量只在循环内使用时,应该将变量定义在循环外还是定义在循环内呢?
情况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次构造函数 + n 次赋值操作 + 1 次析构函数
情况 B 的成本为:n 次构造函数 + n 次析构函数
当一个赋值操作成本低于一组构造成本 + 析构成本,情况 A 的成本低于情况 B 。情况 B 的 w 作用域限制在循环内,情况 A 不利于对程序时的可理解性和易维护性。因此除非:(1)明确一个赋值操作成本低于一组构造成本 + 析构成本;(2)正在处理效率高度敏感的代码。 否则使用情况 B。