【Effection C++】读书笔记 条款26:尽可能延后变量定义式的出现时间
【Effective C++】读书笔记 Part5 实现
条款26:尽可能延后变量定义式的出现时间
非循环中的变量定义
尽量延后变量定义式的出现时间,主要包括两个方面:
- 直到必须使用变量的时候才对其进行定义,否则就不定义。这样子可以减定义对象时候需要的构造函数和析构函数的开销。
- 有初值实参的时候再进行定义变量,比直接使用默认构造函数再赋值的效率要高。
如下函数
void encrypt(std::string &s)
{//具体加密操作;
}std::string encryptPassword(const std::string &password)
{using namespace::std;string encrypted;//流控制,判断密码长度if(password.length() < MinimumPasswordLength){throw loginc_error("Password is too short");}//具体获取密码加密操作encrypted = password;encrypt(encrypted);return encrypted;
}
考虑一下上述函数的缺陷:
- if流控制可能会导致过早的结束函数块,显然在流控制之前并没有任何语句需要encrypted变量。但是即使流控制提早结束,仍然需要encrypted的构造函数和析构函数的开销。
- 对于encrypted变量,先使用默认构造函数进行定义,在进行赋值操作。显然不如直接采用初值进行构造更有效率。
相应的改良版本:
void encrypt(std::string &s)
{//具体加密操作;
}std::string encryptPassword(const std::string &password)
{using namespace::std;//流控制,判断密码长度if(password.length() < MinimumPasswordLength){throw loginc_error("Password is too short");}//具体获取密码加密操作string encrypted(password);encrypt(encrypted);return encrypted;
}
如上版本,就实现了尽可能延后变量定义式的出现时间。
循环中的变量定义
考虑如下两个版本,一个版本将循环中将要使用的变量定义在循环外部,一个版本将循环中将要使用的变量定义在循环内部。
A版本:
Widget w
for(int i = 0; i < n; ++i)
{w = 取决于i的值;
}
B版本:
for(int i = 0; i < n; ++i)
{Widget w(取决于i的值);
}
对于A版本,需要一次构造,一次析构,n次赋值操作。
对于B版本,需要n个构造函数,和n个析构函数。
对于class而言,如果其赋值成本低于一组构造+析构成本,做法A大体上而言高于B版本,否则则版本B更好。
此外A版本,名称w的作用域覆盖的范围更广,有时候可能会对程序的可理解性和易维护性造成冲突。但是也有可能某些情况下仍需要在循环外部访问w。
所以除非你知道赋值成本比”析构+构造”成本低,或者你正在处理代码中效率高度敏感的部分,或者你有特殊的需求,否则应该选择做法B。
【Effection C++】读书笔记 条款26:尽可能延后变量定义式的出现时间相关推荐
- 条款25 :尽可能延后变量定义式的出现时间
只要你定义了一个变量,而类型带有一个构造函数和一个析构函数,你就得忍受构造成本与析构成本.或许你认为你不可能定义一个不会使用的变量,但是请看下面的代码: std::stringencryptPassw ...
- 《Effective C++》学习笔记——条款26
***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...
- 【Effection C++】读书笔记 条款01~条款04
[Effection C++]读书笔记 Part1 让自己习惯C++ 条款01:视C++为一个语言联邦 将C++视为一个由相关语言组成的联邦.在其某个次语言中,各种守则简单易懂,容易记住.但当从一个次 ...
- 【Effection C++】读书笔记 条款10~条款12
[Effection C++]读书笔记 Part2 构造/析构/赋值运算 条款09:绝不在构造和析构函数中调用virtual函数 构造函数和析构函数期间不要调用virtual函数,虽然语法上并不会有错 ...
- 【Effection C++】读书笔记 条款05~条款06
[Effection C++]读书笔记 Part2 构造/析构/赋值运算 条款05:了解C++默认编写并调用哪些函数 编译器可以暗自为class创建default构造函数,copy构造函数,copy ...
- 【Effection C++】读书笔记 条款41~条款42
[Effection C++]读书笔记 Part7 模板与泛型编程 条款41:了解隐式接口和编译器多态 本条款主要是讲述了两个概念,隐式接口和编译器多态 1. 显示接口和隐式接口 显示接口是由函数的签 ...
- 【Effection C++】读书笔记 条款07~条款08
[Effection C++]读书笔记 Part2 构造/析构/赋值运算 条款07:为多态基类声明virtual析构函数 带有多态(polymorphic)性质的base classes应该声明一个v ...
- 【Effection C++】读书笔记 条款29~条款30
[Effective C++]读书笔记 Part5 实现 条款29:为异常安全而努力是值得的 当异常被抛出时,待哟异常安全性的函数会: 不泄漏任何资源. 不允许数据败坏. 异常安全函数提供以下三个保证 ...
- 【Effection C++】读书笔记 条款28:避免返回handles指向对象内部成分
[Effective C++]读书笔记 Part5 实现 条款28:避免返回handles指向对象内部成分 避免返回handles(包括references,指针,迭代器)指向对象内部.遵守这个条款可 ...
最新文章
- 详解vue 路由跳转四种方式 (带参数)
- visual studio的试用版评估期已结束 解决办法
- 几u产品结构计算机什么意思,计算机u系统组成.ppt
- 读取文件中的文本并返回字符串
- C语言字符数组与字符串
- Fastdfs分布式文件系统的应用
- codeforces hack
- (二)PowerLink理论知识
- 2019支付版/聚合支付第三方支付/四方支付系统/提供技术咨询服务
- 神经网络未来发展趋势,神经网络未来发展前景
- 如何将图片格式转换为ico格式
- 怎么安装aptdaemon模块_安装Pulseaudio模块在Ubuntu中开启蓝牙APTX/LDAC支持
- 如何用python处理excel中时间重合_python读取Excel文件中的时间,并计算时间间隔...
- 《算法竞赛入门经典》(第二版)代码及详细解释(持续更新!)
- Spring RMI反序列化漏洞分析
- GD32W515系列Wi-Fi MCU资料
- 自定义控件从入门到轻生之---来个结晶
- 使用Sentinel Dashboard监控项目流量
- centos6安装GitLab全程详解和常见问题解决
- 【知识点】多光谱与高光谱的区别
热门文章
- 625 这个数字很特别,625 的平方等于 390625,刚好其末 3 位是 625 本身。除了 625,还有其 它的 3 位数有这个特征吗?请编写程序,寻找所有这样的 3 位数:它的平方的末 3
- java 名字的漂亮度_名字的漂亮度
- 亲测成功解决internal / modules / cjs / loader.js:800 throw err;
- 串的模式匹配算法(超详细)
- 服务器租用有什么优势
- oppo reno2 z可以升级鸿蒙吗,免费手机铃声下载,OPPO 正式公布 OPPO Reno2 Z:联发科 P90 处理器...
- 0代码,1起造 伙伴云×企业微信联合发布会在京圆满举行
- [引流源码]:QQ全套扫码加速引流源码分享,全静态 可以做各种扫码加速引流+免费分享
- Mybatis - Mybatis简介到完善Idea配置Mybatis、以及idea连接Mysql数据库方法
- 用ZWCAD软件的旋转命令来绘制简易花瓶吧!一起学习吧!!!