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.用于定义常量变量,这样这个变量在后面就不可以 ...
随机推荐
- 【并查集&&带权并查集】BZOJ3296&&POJ1182
bzoj1529[POI2005]ska Piggy banks [题目大意] n头奶牛m种语言,每种奶牛分别掌握一些语言.问至少再让奶牛多学多少种语言,才能使得它们能够直接或间接交流? [思路] ( ...
- Beego 和 Bee 的开发实例
Beego不是一般的web开发包.它构建在大量已存在的Go之上,提供了许多的功能,以下是提供的功能: 一个完整的ORM 缓存 支持session 国际化(i18n) 实时监测和重载 发布支持 ==== ...
- 【提权思路】绕过SecureRDP限制远程连接
工具可以在百度上下载 直接步入正题 配置好的SecureRDP是限制远程登录的用户 原理是判断来访的计算机名是否在白名单中 如果不在,便出现如上图所示 网上也有绕过方法(https://weibo.c ...
- .NET面试宝典-高级(一)
1. DateTime.Parse(myString); 这段代码有什么问题? A:区域信息即CultureInfo没有指定.如果不指定的话,它将采用默认的机器级的设置(见:控制面板->区域和语 ...
- windows下tomcat的安装配置
一.下载相应的JDK以及tomcat的版本 JDK:jdk-8u131-windows-x64 tomcat:apache-tomcat-8.5.23-windows-x64.zip 二.JDK的安装 ...
- Java线程锁&分布式锁的理解及应用
了解Java线程锁之前,先理解线程和进程的定义.进程是操作系统分配资源(CPU)的基本单位,线程是CPU执行的基本单位,一个进程可拥有多个线程,同进程间的多个线程共享分配给进程的资源.比如启动JVM时 ...
- AES advanced encryption standard
// advanced encryption standard // author: karl malbrain, malbrain@yahoo.com typedef unsigned char u ...
- Maven系列--setting.xml 配置详解
文件存放位置 全局配置: ${M2_HOME}/conf/settings.xml 用户配置: ${user.home}/.m2/settings.xml note:用户配置优先于全局配置.${use ...
- 浅析Windows系统调用——2种切换到内核模式的方法
http://shayi1983.blog.51cto.com/4681835/1710861/
- 用最简单的例子理解装饰器模式(Decorator Pattern)
假设有一个公司要做产品套餐,即把不同的产品组合在一起,不同的组合对应不同的价格.最终呈现出来的效果是:把产品组合的所有元素呈现出来,并显示该组合的价格. 每个产品都有名称和价格,首先设计一个关于产品的 ...