【Effective C++】读书笔记 Part5 实现

条款26:尽可能延后变量定义式的出现时间

非循环中的变量定义

尽量延后变量定义式的出现时间,主要包括两个方面:

  1. 直到必须使用变量的时候才对其进行定义,否则就不定义。这样子可以减定义对象时候需要的构造函数和析构函数的开销。
  2. 有初值实参的时候再进行定义变量,比直接使用默认构造函数再赋值的效率要高。

如下函数

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;
}

考虑一下上述函数的缺陷:

  1. if流控制可能会导致过早的结束函数块,显然在流控制之前并没有任何语句需要encrypted变量。但是即使流控制提早结束,仍然需要encrypted的构造函数和析构函数的开销。
  2. 对于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:尽可能延后变量定义式的出现时间相关推荐

  1. 条款25 :尽可能延后变量定义式的出现时间

    只要你定义了一个变量,而类型带有一个构造函数和一个析构函数,你就得忍受构造成本与析构成本.或许你认为你不可能定义一个不会使用的变量,但是请看下面的代码: std::stringencryptPassw ...

  2. 《Effective C++》学习笔记——条款26

    ***************************************转载请注明出处:http://blog.csdn.net/lttree************************** ...

  3. 【Effection C++】读书笔记 条款01~条款04

    [Effection C++]读书笔记 Part1 让自己习惯C++ 条款01:视C++为一个语言联邦 将C++视为一个由相关语言组成的联邦.在其某个次语言中,各种守则简单易懂,容易记住.但当从一个次 ...

  4. 【Effection C++】读书笔记 条款10~条款12

    [Effection C++]读书笔记 Part2 构造/析构/赋值运算 条款09:绝不在构造和析构函数中调用virtual函数 构造函数和析构函数期间不要调用virtual函数,虽然语法上并不会有错 ...

  5. 【Effection C++】读书笔记 条款05~条款06

    [Effection C++]读书笔记 Part2 构造/析构/赋值运算 条款05:了解C++默认编写并调用哪些函数 编译器可以暗自为class创建default构造函数,copy构造函数,copy ...

  6. 【Effection C++】读书笔记 条款41~条款42

    [Effection C++]读书笔记 Part7 模板与泛型编程 条款41:了解隐式接口和编译器多态 本条款主要是讲述了两个概念,隐式接口和编译器多态 1. 显示接口和隐式接口 显示接口是由函数的签 ...

  7. 【Effection C++】读书笔记 条款07~条款08

    [Effection C++]读书笔记 Part2 构造/析构/赋值运算 条款07:为多态基类声明virtual析构函数 带有多态(polymorphic)性质的base classes应该声明一个v ...

  8. 【Effection C++】读书笔记 条款29~条款30

    [Effective C++]读书笔记 Part5 实现 条款29:为异常安全而努力是值得的 当异常被抛出时,待哟异常安全性的函数会: 不泄漏任何资源. 不允许数据败坏. 异常安全函数提供以下三个保证 ...

  9. 【Effection C++】读书笔记 条款28:避免返回handles指向对象内部成分

    [Effective C++]读书笔记 Part5 实现 条款28:避免返回handles指向对象内部成分 避免返回handles(包括references,指针,迭代器)指向对象内部.遵守这个条款可 ...

最新文章

  1. 详解vue 路由跳转四种方式 (带参数)
  2. visual studio的试用版评估期已结束 解决办法
  3. 几u产品结构计算机什么意思,计算机u系统组成.ppt
  4. 读取文件中的文本并返回字符串
  5. C语言字符数组与字符串
  6. Fastdfs分布式文件系统的应用
  7. codeforces hack
  8. (二)PowerLink理论知识
  9. 2019支付版/聚合支付第三方支付/四方支付系统/提供技术咨询服务
  10. 神经网络未来发展趋势,神经网络未来发展前景
  11. 如何将图片格式转换为ico格式
  12. 怎么安装aptdaemon模块_安装Pulseaudio模块在Ubuntu中开启蓝牙APTX/LDAC支持
  13. 如何用python处理excel中时间重合_python读取Excel文件中的时间,并计算时间间隔...
  14. 《算法竞赛入门经典》(第二版)代码及详细解释(持续更新!)
  15. Spring RMI反序列化漏洞分析
  16. GD32W515系列Wi-Fi MCU资料
  17. 自定义控件从入门到轻生之---来个结晶
  18. 使用Sentinel Dashboard监控项目流量
  19. centos6安装GitLab全程详解和常见问题解决
  20. 【知识点】多光谱与高光谱的区别

热门文章

  1. 625 这个数字很特别,625 的平方等于 390625,刚好其末 3 位是 625 本身。除了 625,还有其 它的 3 位数有这个特征吗?请编写程序,寻找所有这样的 3 位数:它的平方的末 3
  2. java 名字的漂亮度_名字的漂亮度
  3. 亲测成功解决internal / modules / cjs / loader.js:800 throw err;
  4. 串的模式匹配算法(超详细)
  5. 服务器租用有什么优势
  6. oppo reno2 z可以升级鸿蒙吗,免费手机铃声下载,OPPO 正式公布 OPPO Reno2 Z:联发科 P90 处理器...
  7. 0代码,1起造 伙伴云×企业微信联合发布会在京圆满举行
  8. [引流源码]:QQ全套扫码加速引流源码分享,全静态 可以做各种扫码加速引流+免费分享
  9. Mybatis - Mybatis简介到完善Idea配置Mybatis、以及idea连接Mysql数据库方法
  10. 用ZWCAD软件的旋转命令来绘制简易花瓶吧!一起学习吧!!!