引言

每一次构造和析构都需要成本,因此我们在设计代码的时候,应该尽可能考虑到构造和析构的成本。

第一节 延后实现

考虑有以下的代码:

 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]尽可能延后变量定义式的出现时间的更多相关文章

  1. 条款26:尽可能延后变量定义式的出现时间(Postpone variable definitions as long as possible)

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

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

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

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

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

  4. 读书笔记_Effective_C++_条款二十六:尽可能延后变量定义式的出现时间

    这个条款从字面意思还是很好理解的,就是在使用这个变量前才去定义,而不是很早就定义了它,而在很后面的时候才去使用.这个条款只适用于对变量声明位置没有要求的语言,比如C++.对于像C或者一些脚本语言,语法 ...

  5. [EffectiveC++]item26:尽可能延后变量定义式的出现时间

  6. Effective C++ 第二版 31)局部对象引用和函数内new的指针 32)推迟变量定义

    条款31 千万不要返回局部对象的引用, 不要返回函数内部用new初始化的指针的引用 第一种情况: 返回局部对象的引用; 局部对象--仅仅是局部的, 在定义时创建, 在离开生命空间时被销毁; 所谓生命空 ...

  7. 读书笔记 effective c++ Item 26 尽量推迟变量的定义

    1. 定义变量会引发构造和析构开销 每当你定义一种类型的变量时:当控制流到达变量的定义点时,你引入了调用构造函数的开销,当离开变量的作用域之后,你引入了调用析构函数的开销.对未使用到的变量同样会产生开 ...

  8. Python_Tips[2] -> 函数延后估值及字节码分析

    函数延后估值及字节码分析 在一个循环中定义了函数 f 但是并未对其进行调用,在循环结束后调用,此时i值为3故最终3个函数输出均为9.而非1, 4, 9. 这是由于在定义闭包函数 f 时,传入变量 i, ...

  9. 01 shell编程之变量定义

    一.SHELL介绍 ㈠ 什么是shell脚本? 简单来说就是将需要执行的命令保存到文本中,按照顺序执行.它是解释型的,意味着不需要编译. 若干命令 + 脚本的基本格式 + 脚本特定语法 + 思想= s ...

随机推荐

  1. Dataguard Content

    1.Dataguard环境设计的三个重要概念 1.1 Primary数据库 在Data Guard的环境中与Standby数据库对应的数据库即是Primary数据库,也就是Primary数据库正在运行 ...

  2. 剑指Offer:连续子数组的最大和

    题目: 输入一个整型数组, 数组里有正数也有负数. 数组中的一个或连续的多个整数组成一个子数组. 求所有子数组的和的最大值. 要求时间复杂度为O(n) #include <stdio.h> ...

  3. (七)学习CSS之filter属性

    filter: alpha(opacity=,finishopacity=,style=)??? alpha是来设置透明度的,它的基本属性是filter:alpha(opacity,finishopa ...

  4. [面试题] for() while() 条件判断 赋值问题

    http://group.jobbole.com/7963/#comm-11311 [题目]:下列for循环的循环体执行次数为 for(int i=10, j=1; i=j=0; i++, j--)( ...

  5. SQL中的CASE WHEN用法

    其语法如下: 1)case vlaue when [compare-value]then reslut [when[compare-value]] then result ...] [else res ...

  6. 为枚举类型添加说明 zt

    enum Orientation { [DescriptionAttribute("东")] East, [DescriptionAttribute("南")] ...

  7. Zabbix探索:纠结的选择

    Zabbix拥有两种分布式部署的架构,分别是: Master-Node-Client: Master-Proxy-Client: 两者的区别什么的官方有介绍,但是太过于笼统,对细节介绍的太少,幸亏之前 ...

  8. NOIP 2014 无线网络发射器选址

    水题..直接暴力 #include<cstdio> #include<algorithm> using namespace std; const int inf = 0x3f3 ...

  9. 【解决】国内访问github过慢

    github在国内慢的有点不能忍了,受不了了google了一下有什么方法没,还真找到一些方法. 死马当活马医,操作完之后确实速度上快了一些,但是毕竟国情所限,仍然做不到“秒开”. 主要是参考两篇博客: ...

  10. HW7.10

    public class Solution { public static void main(String[] args) { int[][] array = new int[3][3]; for( ...