[Effective C++ --026]尽可能延后变量定义式的出现时间
引言
每一次构造和析构都需要成本,因此我们在设计代码的时候,应该尽可能考虑到构造和析构的成本。
第一节 延后实现
考虑有以下的代码:
void encrypt(string& s);
string encryptPassword(const sting& password) {
string encrypted;
if (xxxxx) {
throw logic_error("xxxxxx");
}
encrypted = password;
encrypt(encrypted); return encrypted;
}
在上述代码中,encrypted在被创建过后,如果抛出异常,那么就不会再使用。但是我们还得负担他的构造和析构成本。
我们可以考虑改成这样:
void encrypt(string& s);
string encryptPassword(const sting& password) {
if (xxxxx) {
throw logic_error("xxxxxx");
}
string encrypted;
encrypted = password;
encrypt(encrypted); return encrypted;
}
这样虽然很好的避免了上面的析构和构造问题,但是在第6行还是会调用string的默认的构造函数。
因此我们可以考虑再这样修改:
void encrypt(string& s);
string encryptPassword(const sting& password) {
if (xxxxx) {
throw logic_error("xxxxxx");
}
string encrypted(password); // 使用拷贝构造函数定义并初始化
encrypt(encrypted); return encrypted;
}
可以避免无谓的默认构造行为。
第二节 循环
代码写的多了,都会出现下面这两种情况:
1.
Widget W;
for (int i = ; i < n; i++) {
w = .....
.......
}
2.
for (int i = ; i < n; i++) {
Widget w( .....);
.......
}
方法1:1个构造函数+1个析构函数+n个赋值操作
方法2:n个构造函数+n个析构函数
如果class的一个赋值成本低于一组构造+析构成本,那么做法A比较高效。否则B或许好些。
◆总结
1.尽可能延后变量定义式的出现。这样做可增加程序的清晰度并改善程序效率。
[Effective C++ --026]尽可能延后变量定义式的出现时间的更多相关文章
- 条款26:尽可能延后变量定义式的出现时间(Postpone variable definitions as long as possible)
NOTE : 1.尽可能延后变量定义式的出现时间.这样做可增加程序的清晰度并改善程序效率.
- Effective C++ -----条款26:尽可能延后变量定义式的出现时间
尽可能延后变量定义式的出现.这样做可增加程序的清晰度并改善程序效率.
- Effective C++:条款26:尽可能延后变量定义式的出现时间
(一) 那么当程序的控制流到达这个变量定义时.变承受构造成本:当变量离开作用域时.便承受析构成本. string encryptPassword(const std::string& pass ...
- 读书笔记_Effective_C++_条款二十六:尽可能延后变量定义式的出现时间
这个条款从字面意思还是很好理解的,就是在使用这个变量前才去定义,而不是很早就定义了它,而在很后面的时候才去使用.这个条款只适用于对变量声明位置没有要求的语言,比如C++.对于像C或者一些脚本语言,语法 ...
- [EffectiveC++]item26:尽可能延后变量定义式的出现时间
- Effective C++ 第二版 31)局部对象引用和函数内new的指针 32)推迟变量定义
条款31 千万不要返回局部对象的引用, 不要返回函数内部用new初始化的指针的引用 第一种情况: 返回局部对象的引用; 局部对象--仅仅是局部的, 在定义时创建, 在离开生命空间时被销毁; 所谓生命空 ...
- 读书笔记 effective c++ Item 26 尽量推迟变量的定义
1. 定义变量会引发构造和析构开销 每当你定义一种类型的变量时:当控制流到达变量的定义点时,你引入了调用构造函数的开销,当离开变量的作用域之后,你引入了调用析构函数的开销.对未使用到的变量同样会产生开 ...
- Python_Tips[2] -> 函数延后估值及字节码分析
函数延后估值及字节码分析 在一个循环中定义了函数 f 但是并未对其进行调用,在循环结束后调用,此时i值为3故最终3个函数输出均为9.而非1, 4, 9. 这是由于在定义闭包函数 f 时,传入变量 i, ...
- 01 shell编程之变量定义
一.SHELL介绍 ㈠ 什么是shell脚本? 简单来说就是将需要执行的命令保存到文本中,按照顺序执行.它是解释型的,意味着不需要编译. 若干命令 + 脚本的基本格式 + 脚本特定语法 + 思想= s ...
随机推荐
- ↗☻【编写可维护的JavaScript #BOOK#】第4章 变量、函数和运算符
<!DOCTYPE html> <html lang="zh-CN"> <head> <meta charset="utf-8& ...
- Hibernate4.x之映射关系--双向1-n
双向1-n与双向n-1是完全相同的两种情形 双向1-n需要在1的一端可以访问n的一端,反之亦然. 域模型:从Order到Customer的多对一双向关联需要在Order类中定义一个Customer属性 ...
- ExpectationMaximum
2- You may have question marks in your head, especially regarding where the probabilities in the Exp ...
- 把之前写的几个项目放到了github上
之前有的源码放在我的电脑里不知道什么时候就没了,满满都是回忆啊,怪可惜的. https://github.com/redclock/Adv-Game:一个java游戏 https://github.c ...
- MVC框架模式技术实例(用到隐藏帧、json、仿Ajax、Dom4j、jstl、el等)
前言: 刚刚学完了MVC,根据自己的感悟和理解写了一个小项目. 完全按照MVC模式,后面有一个MVC的理解示意图. 用MVC模式重新完成了联系人的管理系统: 用户需求: 多用户系统,提供用户注册.登录 ...
- ASP.NET入门(class0612)
内容:掌握基于ASP.Net的Web开发,B/S结构原理.ASP.Net内部原理.状态管理(Cookie.Session.ViewState等).数据验证.普通ASP.Net控件.母版.ListVie ...
- 怎么解决div覆盖内容却没覆盖的问题?
一.在上下结构的div布局中,可能出现div覆盖div,但是内容却没有出现覆盖的现象.看看一个示例 1: <!DOCTYPE html> 2: <html> 3: <he ...
- 洛谷 P1169 [ZJOI2007]棋盘制作
2016-05-31 14:56:17 题目链接: 洛谷 P1169 [ZJOI2007]棋盘制作 题目大意: 给定一块矩形,求出满足棋盘式黑白间隔的最大矩形大小和最大正方形大小 解法: 神犇王知昆的 ...
- Android实例-解决启动黑屏问题(XE8+小米2)
结果: 1.在启动时马上出现图片界面,但在出现程序界面前会有黑屏,大约有0.2秒左右. 实现: 1.建立2个文件:loading.png和styles.xml: ①其中loading.png是启动时替 ...
- SQL2008-中不想插入从复记录
If not exists (SELECT ID FROM StuffAgitationYield where EMAgitation_ID=1 and YieldDateTime'2012-06-1 ...