(一)

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

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. 【10.29校内测试】【线段树】【DP】【二进制Trie树求最小值最大】

    Solution 标程太暴力惹QAQ 相当于是26棵线段树的说QAQ 不过我写了另一种写法,从大到小枚举每一个字母,标记字典序在这个字母之上的位置为1,每次都建一棵线段树,维护1的数量,即区间和. 修 ...

  2. wxwidget wxpython 可视化开发工具

    wxwidget官方建议的工具集合:http://wiki.wxwidgets.org/Tools 支持wxpython可视化开发工具 wxFormBuilder wxGlade wxDesigner ...

  3. wikioi 1017 乘积最大

    dp[i][j]=max(dp[i][j],dp[t][k-1]*mapn[t+1][i]); dp[i][j]代表从0-i之间有j个乘号,mapn[i][j]表示第i位到第j位的数究竟是多少 #in ...

  4. ROS知识(9)----安装Turtlebot2和远程控制Turtlebot2

    安装turtlebot2,场景为:turtlebot2上搭载着一台电脑主机A,该电脑作为主机Master,有自带的电源和3D传感器,roscore在该台机器上启动.pc电脑远程连接A,和A通讯,pc不 ...

  5. macbook pro 开发帮助

    java安装目录 /Library/java/JavaVirtualMachines/ 设置快捷目录 vim .bash_profile 文件中追加一下信息:export dirname=目录路径 重 ...

  6. BlueMind 3.0.17 发布,消息和协作平台

    BlueMind 3.0.17 发布,此版本对即时消息 Web 应用连接处理做了较大改进(更可靠),还修复了通讯录浏览器. BlueMind 3.0.17 现已提供下载. 详细改进记录如下: Addr ...

  7. 重温PHP之插入排序

    插入排序基本思路:将数组分为两个区(已排序区和未排序区),假定数组的第一个元素处于已排序区, 第一个元素之后的所有元素都处于未排序部分.排序时用到双层循环,外层循环用于从未排序部分中取出待排序元素,并 ...

  8. jQuery动画高级用法(上)——详解animation中的.queue()函数

    如果你拿着一个疑问去找专业人士寻找答案,那么你的一个疑问会变成三个,因为他会用另外两个令你更加一头雾水的名词来解释你的这个疑问. 我想这是大多数,包括我在内,IT人在学习过程中碰到的最大问题.当你有一 ...

  9. 介绍一下开源项目FastAnimationWithPOP

    介绍一下开源项目FastAnimationWithPOP JUL 23RD, 2014 这是一个非常easy的动画框架,基于Facebook的POP库. 使用它你就能够在故事版中以0行代码的代价来加入 ...

  10. Maven最佳实践:Maven仓库

    什么是Maven仓库 在不用Maven的时候,比如说以前我们用Ant构建项目,在项目目录下,往往会看到一个名为/lib的子目录,那里存放着各类第三方依赖jar文 件,如log4j.jar,junit. ...