Note of Justin

关于工作和读书的笔记

  C++博客 :: 首页 :: 联系 :: 聚合  :: 管理
  47 Posts :: 0 Stories :: 45 Comments :: 0 Trackbacks

留言簿(14)

搜索

  •  

积分与排名

  • 积分 - 51888
  • 排名 - 433

最新评论

阅读排行榜

评论排行榜

[原创文章欢迎转载,但请保留作者信息]
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方法还是更合理。
【答案】没有标准答案@#¥%
posted on 2010-01-20 08:52 Justin.H 阅读(1168) 评论(2)  编辑 收藏 引用 所属分类: Effective C++ 炒冷饭

Feedback

# re: Effective C++ 炒冷饭 - Item 26 尽可能推迟定义变量 2010-01-20 13:22 wildpointer
顶一下!f  回复  更多评论
  

# re: Effective C++ 炒冷饭 - Item 26 尽可能推迟定义变量 2010-03-30 18:43 kairos
不错 很细节  回复  更多评论
  


只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   博问   Chat2DB   管理