[Effective C++ --026]尽可能延后变量定义式的出现时间

引言

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

第一节 延后实现

考虑有以下的代码:

 1 void encrypt(string& s);
 2 string encryptPassword(const sting& password) {
 3     string encrypted;
 4     if (xxxxx) {
 5          throw logic_error("xxxxxx");
 6     }
 7     encrypted = password;
 8     encrypt(encrypted);
 9
10     return encrypted;
11 }

在上述代码中,encrypted在被创建过后,如果抛出异常,那么就不会再使用。但是我们还得负担他的构造和析构成本。

我们可以考虑改成这样:

 1 void encrypt(string& s);
 2 string encryptPassword(const sting& password) {
 3     if (xxxxx) {
 4          throw logic_error("xxxxxx");
 5     }
 6     string encrypted;
 7     encrypted = password;
 8     encrypt(encrypted);
 9
10     return encrypted;
11 }

这样虽然很好的避免了上面的析构和构造问题,但是在第6行还是会调用string的默认的构造函数。

因此我们可以考虑再这样修改:

 1 void encrypt(string& s);
 2 string encryptPassword(const sting& password) {
 3     if (xxxxx) {
 4          throw logic_error("xxxxxx");
 5     }
 6     string encrypted(password);  // 使用拷贝构造函数定义并初始化
 7     encrypt(encrypted);
 8
 9     return encrypted;
10 }

可以避免无谓的默认构造行为。

第二节 循环

代码写的多了,都会出现下面这两种情况:

1.

1 Widget W;
2 for (int i = 0; i < n; i++) {
3     w = .....
4     .......
5 }

2.

1 for (int i = 0; i < n; i++) {
2     Widget w( .....);
3     .......
4 }

方法1:1个构造函数+1个析构函数+n个赋值操作

方法2:n个构造函数+n个析构函数

如果class的一个赋值成本低于一组构造+析构成本,那么做法A比较高效。否则B或许好些。

◆总结

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

时间: 2024-11-09 02:22:48

[Effective C++ --026]尽可能延后变量定义式的出现时间的相关文章

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

<Effective C++> 条款26:尽可能延后变量定义式的出现时间 只要你定义了一个变量而其类型带有一个构造函数和析构函数,那么当程序的控制流到达这个变量定义式时,你便得承受构造成本:当这个变量离开作用域时,你便得承受析构成本.即使这个变量最终并未被使用,仍需耗费这些成本,所以你应该尽量避免这种情形. 对于"尽可能延后"的理解: 不只应该延后变量多的定义,直到非得使用该变量的前一刻为止,甚至应该尝试延后这份定义直到能够给它初始实参为止.如果这样,不仅能够避免构造(析构

Effective C++ Item 26 尽可能延后变量定义式的出现时间

本文为senlie原创,转载请保留此地址:http://blog.csdn.net/zhengsenlie 经验:尽可能延后变量定义式的出现.这样做可增加程序的清晰度并改善程序效率. 示例: //这个函数过早定义变量"encrypted" std::string encryptPassword(const std::string &password){ using namespace std; string encrypted; if(password.length() <

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

(一) 那么当程序的控制流到达这个变量定义时,变承受构造成本:当变量离开作用域时,便承受析构成本. string encryptPassword(const std::string& password) { using namespace std; string encrypted; if(password.length() < MinimumPasswordLengt) { throw logic_error("Password is too short") } -//

C++(Qt)之尽可能延后定义式的出现时间

最近在看Scott Meyers的<Effective C++>改善程序与设计的55个具体做法(第三版),水平有限,有些东西没能完全理解,捡一些自己能理解的并很容易记住的点来分享下!有的是原文的内容的直接摘抄,敬请谅解! 这条建议是:尽可能地延后定义式的出现时间.这么做的意义在于:可增加程序的清晰度并改善程序的效率.这对小程序来说可能体会的不深或者说影响不大,但是我们依然要保持良好的代码习惯和提高代码段的质量,不是吗? 作者给的解释是:只要你定义了一个变量而其类型带有一个构造函数或者析构函数,

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

1. 定义变量会引发构造和析构开销 每当你定义一种类型的变量时:当控制流到达变量的定义点时,你引入了调用构造函数的开销,当离开变量的作用域之后,你引入了调用析构函数的开销.对未使用到的变量同样会产生开销,因此对这种定义要尽可能的避免. 2. 普通函数中的变量定义推迟 2.1 变量有可能不会被使用到的例子 你可能会想你永远不会定义未使用的变量,你可能要再考虑考虑.看下面的函数,此函数返回password的加密版本,提供的password需要足够长.如果password太短,函数会抛出一个logic

条款32: 尽可能地推迟变量的定义

// 此函数太早定义了变量"encrypted" string encryptPassword(const string& password) { string encrypted;//默认构造函数初始化 if (password.length() < MINIMUM_PASSWORD_LENGTH) { throw logic_error("Password is too short"); } 进行必要的操作,将口令的加密版本 放进encrypted

MySql中的变量定义

MySql中的变量定义 根据mysql手册,mysql的变量分为两种:系统变量和用户变量.但是在实际使用中,还会遇到诸如局部变量.会话变量等概念.根据个人感觉,mysql变量大体可以分为四种类型: 一.局部变量. 局部变量一般用在sql语句块中,比如存储过程的begin/end.其作用域仅限于该语句块,在该语句块执行完毕后,局部变量就消失了. 局部变量一般用declare来声明,可以使用default来说明默认值. 例如在存储过程中定义局部变量: drop procedure if exists

c++ 变量 定义 声明

我们在程序设计中,时时刻刻都用到变量的定义和变量的声明,可有些时候我们对这个概念不是很清楚,知道它是怎么用,但却不知是怎么一会事,下面我就简单的把他们的区别介绍如下:(望我的指点对你受益) 变量的声明有两种情况: 1.一种是需要建立存储空间的.例如:int a 在声明的时候就已经建立了存储空间. 2.另一种是不需要建立存储空间的. 例如:extern int a 其中变量a是在别的文件中定义的. 前者是“定义性声明(defining declaration)”或者称为“定义(definition

变量定义及用法的特殊形式实战

例1:经过反引号的`date`命令测试 [[email protected] ~]# echo '`date`'     `date` #单引号时看到啥显示啥 [[email protected] ~]# echo "`date`"  Fri Jun 16 14:45:29 CST 2017 #双引号时如果里面是变量,会先把变量解析成具体内容在显示 [[email protected] ~]# echo `date`   Fri Jun 16 14:46:49 CST 2017 #对于