Effective C++:条款26:尽可能延后变量定义式的出现时间
(一)
那么当程序的控制流到达这个变量定义时。变承受构造成本;当变量离开作用域时。便承受析构成本。
string encryptPassword(const std::string& password) {
using namespace std;
string encrypted;
if(password.length() < MinimumPasswordLengt) {
throw logic_error(“Password is too short”)
}
…//必要动作。将一个加密后的密码置入encrypted内。
return encypted;
}
假设函数encryptPassword丢出异常,你仍得付出encrypted的构造和析构成本。所以最好延后encrypted的定义式。
直到确定须要它:
//这个函数延后“encrypted”的定义,直到真正须要它
string encryptPassword(const std::string& password) {
using namespace std;
if(password.length() < MinimumPasswordLengt) {
throw logic_error(“Password is too short”)
}
string encrypted;
…//必要动作,将一个加密后的密码置入encrypted内。
return encypted;
}
Encrypted虽获定义却无不论什么參数作为初值。
这意味调用的是default构造函数。很多时候你对该对象做的第一个动作就是给它个值,通常通过赋值动作完毕。
以password作为encrypted的初值,跳过毫无意义的default构造函数过程:
string encryptPassword(const std::string& password) {
using namespace std;
if(password.length() < MinimumPasswordLengt) {
throw logic_error(“Password is too short”)
}
string encrypted(password);//通过copy构造函数定义并初始化。
encrypt(encrypted);
return encypted;
}
所以:“尽可能延后”的意义。不仅仅应该延后变量的定义。直到非得使用该变量的前一刻为止,甚至应该尝试延后这份定义直到可以给他初值參数为止。不仅能避免构造(和析构)非必要对象,还可以避免无意义的default构造行为。
(二)
对于循环:
//方法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个构造 + 1个析构 + n个赋值
做法B:n个构造 + n个析构
应该尽量选择B,除非我们能够确定一个赋值的成本比一组“构造+析构”的成本低
或者 正在处理效率高度敏感的部分。另一个原因使得我们尽量使用B,由于B中w作用域比A中更小,更有利于程序的可理解性和易维护性。
请记住:
尽可能延后变量定义式的出现,这样做可添加程序的清晰度并改善程序效率。
Effective C++:条款26:尽可能延后变量定义式的出现时间的更多相关文章
- 条款26:尽可能延后变量定义式的出现时间(Postpone variable definitions as long as possible)
NOTE : 1.尽可能延后变量定义式的出现时间.这样做可增加程序的清晰度并改善程序效率.
- Effective C++ -----条款26:尽可能延后变量定义式的出现时间
尽可能延后变量定义式的出现.这样做可增加程序的清晰度并改善程序效率.
- 读书笔记_Effective_C++_条款二十六:尽可能延后变量定义式的出现时间
这个条款从字面意思还是很好理解的,就是在使用这个变量前才去定义,而不是很早就定义了它,而在很后面的时候才去使用.这个条款只适用于对变量声明位置没有要求的语言,比如C++.对于像C或者一些脚本语言,语法 ...
- [Effective C++ --026]尽可能延后变量定义式的出现时间
引言 每一次构造和析构都需要成本,因此我们在设计代码的时候,应该尽可能考虑到构造和析构的成本. 第一节 延后实现 考虑有以下的代码: void encrypt(string& s); stri ...
- [EffectiveC++]item26:尽可能延后变量定义式的出现时间
- Effective C++ 条款26
尽可能延后变量定义式的出现时间 我们知道定义一个对象的时候有一个不争的事实,那就是分配内存.假设是我们自己定义的对象.程序运行过程中会调用类的构造函数和析构函数. 我们打个例如,假设天下雨了,你带把雨 ...
- Effective C++ -----条款22:将成员变量声明为private
切记将成员变量声明为private.这可赋予客户访问数据的一致性.可细微划分访问控制.允诺约束条件获得保证,并提供class作者以充分的实现弹性. protected并不比public更具有封装性.
- Effective C++ -----条款03:尽可能使用const
如果关键字const出现在星号左边,表示被指物是常量:如果出现在星号右边,表示指针自身是常量:如果出现在星号两边,表示被指物和指针两者都是常量. char greeting[] = " he ...
- Effective C++ 条款三 尽可能使用const
参考资料:http://blog.csdn.net/bizhu12/article/details/6672723 const的常用用法小结 1.用于定义常量变量,这样这个变量在后面就不可以 ...
随机推荐
- Codeforces Round #356 (Div. 1) D. Bear and Chase 暴力
D. Bear and Chase 题目连接: http://codeforces.com/contest/679/problem/D Description Bearland has n citie ...
- 自动打怪 c#
其中思路很简单,单线程的一个乱七八糟的游戏 预计会更新背包,背包这个估计会用一个vector来存 图形的话,我得催催我的美工大人,她会帮我弄吧,哇哈哈 界面: namespace auttompk { ...
- hdu 4163 Stock Prices 花式排序
Stock Prices Time Limit: 10000/5000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Tot ...
- Bootstrap_表格
Bootstrap 表格 Bootstrap 提供了一个清晰的创建表格的布局.下表列出了 Bootstrap 支持的一些表格元素: 标签 描述 <table> 为表格添加基础样式. < ...
- PCI DSS合规建设ASV扫描介绍
最近查一些Nessus.Nexpose漏洞扫描工具相关资料,工具介绍都会提到一些审计功能,其中最常见的就是PCI DSS合规性审计.从网上找到一篇介绍较详尽的文章,与大家分享. 原文摘自:http:/ ...
- Tomcat篇
安装tomcat 先从tomcat官网找到最新的版本下载地址,我找的是Core下的安装包,下载到本地: wget http://mirror.bit.edu.cn/apache/tomcat/tomc ...
- linux内核 asmlinkage宏
http://blog.chinaunix.net/uid-7390305-id-2057287.html
- weblogic 12C 安全加强:更改Console及管理端口
一.管理端口的好处:1.由于我们使用的是weblogic直接提供web访问,所以防火墙无法对80端口做安全策略. 2.所有用户都可以使用http://www.reyo.cn/console/来登陆我们 ...
- Spring3.1.2与Hibernate4.1.8整合
整合Spring3.1.2 与 Hibernate 4.1.8 首先准备整合jar: Spring3.1.2: org.springframework.aop-3.1.2.RELEASE.jar or ...
- 采用Operator-sdk轻松将helm chart转为Operator
去年就接触Operator,从Oracle发布的WebLogic Operator到mySQL Operator,构建的源码一大堆,但感觉一直缺少合适的开发框架能够避免复杂性快速生成, 随着技术的日益 ...