Effective-cpp-#26

Postpone variable definitions as long as possible

动机

这个的条例提出的原因是——当你定义了一个带有构造函数或者析构函数的变量时,那么当程序的control flow到达这个变量的定义表达式时,你就要承受其构造的成本,同样,当离开变量作用域时,还需要承受析构成本。

关键是,即便你没有使用这个变量,也要耗费这些成本

考虑一个函数:

1
2
3
4
5
6
7
8
9
10
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就没被使用,但你仍然需要承受其构造和析构的成本;

解决方法

解决方法很简单,什么时候使用就什么时候定义。但这个过程需要注意的是通常情况下我们应该尽量避免使用default构造函数,应该在构造时就赋予初值。

另外有一个需要注意的问题是,循环怎么办?

1
2
3
4
5
6
7
8
9
10
11
//Method A
Widget w;
for (int i=0; i<n; i++){
w = 取决于i的值;
}

//Method B

for (int i=0; i<n; i++){
Widget w = 取决于i的值;
}
需要衡量的是: * 方法A:1个构造函数+1个析构函数+n个赋值操作 * 方法B:n个构造函数+n个析构函数

通常情况下,当n比较大时,方法A比较好;否则应该选B

建议

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