(一)

那么当程序的控制流到达这个变量定义时。变承受构造成本;当变量离开作用域时。便承受析构成本。

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:尽可能延后变量定义式的出现时间的更多相关文章

  1. 条款26:尽可能延后变量定义式的出现时间(Postpone variable definitions as long as possible)

    NOTE : 1.尽可能延后变量定义式的出现时间.这样做可增加程序的清晰度并改善程序效率.

  2. Effective C++ -----条款26:尽可能延后变量定义式的出现时间

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

  3. 读书笔记_Effective_C++_条款二十六:尽可能延后变量定义式的出现时间

    这个条款从字面意思还是很好理解的,就是在使用这个变量前才去定义,而不是很早就定义了它,而在很后面的时候才去使用.这个条款只适用于对变量声明位置没有要求的语言,比如C++.对于像C或者一些脚本语言,语法 ...

  4. [Effective C++ --026]尽可能延后变量定义式的出现时间

    引言 每一次构造和析构都需要成本,因此我们在设计代码的时候,应该尽可能考虑到构造和析构的成本. 第一节 延后实现 考虑有以下的代码: void encrypt(string& s); stri ...

  5. [EffectiveC++]item26:尽可能延后变量定义式的出现时间

  6. Effective C++ 条款26

    尽可能延后变量定义式的出现时间 我们知道定义一个对象的时候有一个不争的事实,那就是分配内存.假设是我们自己定义的对象.程序运行过程中会调用类的构造函数和析构函数. 我们打个例如,假设天下雨了,你带把雨 ...

  7. Effective C++ -----条款22:将成员变量声明为private

    切记将成员变量声明为private.这可赋予客户访问数据的一致性.可细微划分访问控制.允诺约束条件获得保证,并提供class作者以充分的实现弹性. protected并不比public更具有封装性.

  8. Effective C++ -----条款03:尽可能使用const

    如果关键字const出现在星号左边,表示被指物是常量:如果出现在星号右边,表示指针自身是常量:如果出现在星号两边,表示被指物和指针两者都是常量. char greeting[] = " he ...

  9. Effective C++ 条款三 尽可能使用const

    参考资料:http://blog.csdn.net/bizhu12/article/details/6672723      const的常用用法小结 1.用于定义常量变量,这样这个变量在后面就不可以 ...

随机推荐

  1. CF961E Tufurama【主席树】

    CF961E Tufurama 题意翻译 题目描述 有一天Polycarp决定重看他最喜爱的电视剧<Tufurama>.当他搜索“在线全高清免费观看Tufurama第3季第7集”却只得到第 ...

  2. .net 基于Jenkins的自动构建系统开发

    先让我给描述一下怎么叫一个自动构建或者说是持续集成 : 就拿一个B/S系统的合作开发来说,在用SVN版本控制的情况下,每个人完成自己代码的编写,阶段性提交代码,然后测试-修改,最后到所有代码完工,进行 ...

  3. HUST 1017 Exact cover(DLX精确覆盖)

    Description There is an N*M matrix with only 0s and 1s, (1 <= N,M <= 1000). An exact cover is ...

  4. .Net C#向远程服务器Api上传文件

    Api服务代码一: /// <summary> /// 服务器接收接口 /// </summary> [HttpPost] [Route("ReceiveFile&q ...

  5. java基础学习总结——多态(动态绑定)

    一.面向对象最核心的机制——动态绑定,也叫多态

  6. Openfire 服务器更换ip后的恢复方法

    如果你的服务器名称和mysql的地址都是使用的静态ip地址配置的,更改ip后,openfire就会开启失败,这种情况下请看下面的解决方法. 比如你的ip地址由 192.168.0.111 改为192. ...

  7. python文本 去掉字符串前后空格

    python文本 去掉字符串前后空格 场景: 去掉字符串前后空格 可以使用strip,lstrip,rstrip方法 >>> a="abc".center (30 ...

  8. git 分支管理策略 与 物理实现 --author by阮一峰 & 小鱼

    -------------------------下面是阮一峰博士的git branch 逻辑结构图示---------------------------------------------- 如果 ...

  9. OpenShift 项目的备份和恢复实验

    本测试记录从openshift 3.6环境中导出项目,然后在将项目环境恢复到Openshift 3.11中所需要的步骤 从而指导导入导出的升级过程. 1.安装Openshift 3.6版本 过程略 2 ...

  10. 启明星会议室预定系统Outlook版开始支持Exchange2013与Office365版

    版本启明星会议室预定系统支持Exchange2013与微软云服务Office365版.(注意:Exchange2007与Exchange2010也适合此版本) 1.安装 首页,安装类似启明星普通的会议 ...