尽可能延后变量定义式的出现时间

我们知道定义一个对象的时候有一个不争的事实,那就是分配内存。假设是我们自己定义的对象。程序运行过程中会调用类的构造函数和析构函数。

我们打个例如,假设天下雨了,你带把雨伞肯定是值得的。

但是,假设你带伞了,今天却没下雨,你是不是感觉自己亏了?的确,亏在了带了却没用,所以伞就变成了累赘。

本节的关键就在于此,假设你定义一个变量或者对象没有被使用,那么就是不完美的代码。

我们看一个代码片段:

std::string encryptPassword(const std::string& psaaword)
{
using namespace std;
string encrypted;
if(password.length()<MinimumPasswordLength)
{
throw logic_error("Password is too short");
}
……//加密密码,把加密结果放到encrypted内
return encrypted;
}

假设,抛出异常,上面的变量encrypted就没有被使用,虽未被使用,但是却要承受一次构造和一次析构的行为。

改进例如以下:

std::string encryptPassword(const std::string& psaaword)
{
using namespace std; if(password.length()<MinimumPasswordLength)
{
throw logic_error("Password is too short");
}
string encrypted;
……//加密密码,把加密结果放到encrypted内
return encrypted;
}

改进的代码跳过了异常。保证定义的encrypted一定被使用。但是我们知道假设可以调用copy构造函数,就没有必要调用default构造函数+赋值运算符函数。由于前者更高效。

我们继续改进代码:

    std::string encryptPassword(const std::string& psaaword)
{
using namespace std;
if(password.length()<MinimumPasswordLength)
{
throw logic_error("Password is too short");
}
string encrypted(password);//定义+赋值
encrypt(encrpted);
……//加密密码,把加密结果放到encrypted内
return encrypted;
}

那么我们在循环中怎么贯彻这样的思想呢?

对照一下代码:

Widget w;//定义在循环外
for(int i=0;i < n;++i)
w=……;
……
} for(int i=0;i<n;++i){
Widget w(……);//定义并赋值
……
}

第一个调用了1个构造函数+1个析构函数+n个赋值操作。第二个调用了n个构造函数+n个析构函数。我们此时须要斟酌一下是赋值操作的效率高还是构造+析构的效率高。其实,假设两方差距不大。最好选用后者,由于后者对象的作用域更小,可维护性和可理解性更强。更安全。

Effective C++ 条款26的更多相关文章

  1. Effective C++ -----条款26:尽可能延后变量定义式的出现时间

    尽可能延后变量定义式的出现.这样做可增加程序的清晰度并改善程序效率.

  2. effective c++ 条款26 postpone variable definition as long as possible

    因为构造和析构函数有开销,所以也许前面定义了,还没用函数就退出了. 所以比较好的方法是用到了才定义.

  3. EC读书笔记系列之14:条款26、27、28、29、30、31

    条款26 尽可能延后变量定义式的出现时间(Lazy evaluation) 记住: ★尽可能延后变量定义式的出现.这样做可增加程序的清晰度并改善程序效率 ----------------------- ...

  4. [More Effective C++]条款22有关返回值优化的验证结果

    (这里的验证结果是针对返回值优化的,其实和条款22本身所说的,考虑以操作符复合形式(op=)取代其独身形式(op),关系不大.书生注) 在[More Effective C++]条款22的最后,在返回 ...

  5. More Effective C++ 条款0,1

    More Effective C++ 条款0,1 条款0 关于编译器 不同的编译器支持C++的特性能力不同.有些编译器不支持bool类型,此时可用 enum bool{false, true};枚举类 ...

  6. 《Effective C++》条款26 防卫潜伏的ambiguity模棱两可的状态

    每个人都有思想.有些人相信自由经济学,有些人相信来生.有些人甚至相信COBOL是一种真正的程序设计语言.C++也有一种思想:它认为潜在的二义性不是一种错误.ambiguity 这是潜在二义性的一个例子 ...

  7. 《more effective c++》条款26 限制类对象的个数

    问题: 如何限制类对象的个数?比如1个,10个等等. 方法(1): 将类的构造函数定义为private,那么就无法实例化这个类了.但是如何创建1个对象出来?方法有2种: 1.声明一个友元函数,那么在友 ...

  8. Effective C++:条款26:尽可能延后变量定义式的出现时间

    (一) 那么当程序的控制流到达这个变量定义时.变承受构造成本:当变量离开作用域时.便承受析构成本. string encryptPassword(const std::string& pass ...

  9. Effective C++ 条款08:别让异常逃离析构函数

    1.别让异常逃离析构函数的原因 <Effective C++>第三版中条款08建议不要在析构函数中抛出异常,原因是C++异常机制不能同时处理两个或两个以上的异常.多个异常同时存在的情况下, ...

随机推荐

  1. [Swift A]-问号&感叹号

    1.必须赋值的变量,或普通变量 var month:Int println("month:\(month)") 上面这2句代码会提示报错,因为没有赋值 2.再看看如下写法 var ...

  2. Java反射机制及Method.invoke详解

    JAVA反射机制 JAVA反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对于任意一个对象,都能够调用它的任意一个方法:这种动态获取的信息以及动态调用对象的方法的功能称为ja ...

  3. Ubuntu桌面操作快捷键

    Ubuntu操作基本快捷键 * 打开主菜单 = Alt + F1 * 运行 = Alt + F2 * 打开终端 = Alt+F2 然后输入gnome-terminal回车 * 显示桌面 = Ctrl ...

  4. Android SDK 快速安装方法

    我们都知道使用Android sdk manager下载安装sdk速度非常慢,一般在10k/s以内,本文章推荐一种能够借助迅雷等下载工具下载sdk的zip包从而快速安装sdk的方法. 1.下载3个xm ...

  5. Android 使用Scroller实现绚丽的ListView左右滑动删除Item效果

    转帖请注明本文出自xiaanming的博客(http://blog.csdn.net/xiaanming/article/details/17539199),请尊重他人的辛勤劳动成果,谢谢! 我在上一 ...

  6. Java Persistence with MyBatis 小结3

    1 映射器配置文件和映射器接口 在 com.mybatis3.mappers 包中的 StudentMapper.xml 配置文件内,是如何配置 id 为”findStudentById”的 SQL ...

  7. Huffman的应用之文件压缩与解压缩

    文件压缩与解压缩>      近期这段时间一直在学习树的这样的数据结构,也接触到了Huffman树以及了解了什仫是Huffman编码,而我们经常使用的zip压缩也是利用的Huffman编码的特性 ...

  8. C++不让程序一闪而过

    末尾加上System("pause") 不过需要注意,这个只在win32下有效.不具备可移植性.

  9. 以byte方式讀取SPD的數據(SMBus Controller在PCH中)

    Reading A Byte of SMBus EEPROM DataThe following steps have to be followed for the System BIOS to re ...

  10. Netty的ByteBuf

    https://blog.csdn.net/thinking_fioa/article/details/80795673  netty的ByteBuf知识点