Effective C++ 炒冷饭 - Item 26 尽可能推迟定义变量

Effective C++ 炒冷饭 - Item 26 尽可能推迟定义变量
[原创文章欢迎转载,但请保留作者信息]
Justin 于 2009-12-29

上课上到第5章,大师开始讲“实现”(implementation)。

第26条还是比较容易读,讲的是一个习惯问题:到使用变量的时候再定义它。
不知道是在小时候学Pascal得到的印象还是C语言课老师传授的“腐朽思想”,在函数/文件的开始总是要定义所有的变量。
大师说:这样不对。

原因是:
  • 定义变量包含了该变量对象的构造操作,如果因为某个原因(如抛出异常,条件语句未执行等)而没有真正用到这个变量,那么构造该变量所耗费的时间和资源就白费了。
  • 在即将使用变量前再定义它对理解代码也有好处:要想知道某个变量时做什么用的?读接下来的代码便是。

其实课上到这里也该算完了,不过Scott还是留了一道简单又不简单的思考题,以及答案:
// 方法A:循环外定义
Widget w;
for  ( int  i  =   0 ; i  <  n;  ++ i){
   w 
=  some_value_dependent_on_i;       
   
// ..                                  
}                                    

// 方法B:循环内定义
for  ( int  i  =   0 ; i  <  n;  ++ i) {
Widget w(some_value_dependent_on_i);
// ..
}

题目抄完了,问题是:A和B哪种变量声明的方式更合适?
【解析】
方法A调用了1次构造函数、1次析构函数、n次拷贝函数;
方法B调用了n次析构函数、n次析构函数。
当拷贝操作的开销比构造-析构操作要廉价的时候,一般来说A方法是上选。
但是A方法中对象的作用域比B方法中更大,也就违背了代码的集中性和可维护性原则。
因此,除非
   拷贝操作比构造-析构操作开销小,并且此部分代码对性能(performance)要求很高,(此时选择为A)
否则B方法还是更合理。
【答案】没有标准答案@#¥%

你可能感兴趣的:(Effective C++ 炒冷饭 - Item 26 尽可能推迟定义变量)