本文总结子EffectiveC++条款27.
太快定义变量可能造成效率上的拖延---尽可能延后变量定义式的出现。这样做可增加程序的清晰度并改善程序效率。
只要定义了一个带构造析构函数的变量,那么当函数的控制流到达这个变量的定义式时就要承受构造和析构成本。因此,为了更好的提高效率应尽量延迟变量的定义直到需要变量,因为定义变量过早可能会造成定义不使用变量,从而增大开销。
<pre name="code" class="cpp">string EP(const string& Val)
{
string tmpVal;
if(Val.length() < MINLENGTH)
{
throw logic_error("is too short");
}
return tmpVal;
}
因此如果string长度满足if判断,则会丢出异常,程序提前退出。但是此时仍然要承受tmpVal带来的构造和析构成本。
上边代码在进行tmpVal定义时并没有给他赋值初值,因此在某些情况下其效率并不高。因为通过default构造函数构造出初始值在通过赋值操作比直接在构造时指定初值效率差。
string encrypt(string& s);
string EP(const string& Val)
{
string tmpVal;
tmpVal =Val;
encrypt(tmpVal);
return tmpVal;
}
跳过毫无意义的default构造过程:
string encrypt(string& s);
string EP(const string& Val)
{
string tmpVal(Val);
encrypt(tmpVal);
return tmpVal;
}
因此延后变量的定义,不仅仅直到使用变量的前一刻为止而应该延后变量定义知道能够给他初值实参为止。
对于循环变量的定义分两种情况讨论:
(1)变量定义在循环外
ClassVal w;
for(int i=0;i<n;)
{
w=取决于i的某个值;
}
(2)定义于循环内
for(int i=0;i<n;)
{
ClassVal w;
}
做法(1),一个构造函数,一个析构函数,n个赋值操作;做法(2)n个构造函数,n个析构函数
如果一个赋值成本低于一组构造+析构成本,做法(1)比较高效。但是(1)w的作用域比(2)大,对程序的可理解性和维护性造成冲击。因此除非(1)比(2)成本低,或者处理的代码效率高度敏感,否则应使用(2)。