美文网首页C++ 杂记
条款 26:尽可能延后变量定义式的出现实现时间

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

作者: 赵者也 | 来源:发表于2017-08-12 06:59 被阅读4次

Effective C++ 中文版 第三版》读书笔记

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

只要定义一个变量,而其类型带有一个构造函数或析构函数,

那么当程序的控制流到达这个变量定义时,变承受构造成本;当变量离开作用域时,便承受析构成本。

// 这个函数过早定义变量 “encrypted”
std::string encryptPassword(const std::string& password) 
{
    using namespace std;
    string encrypted;
    if(password.length() < MinimumPasswordLengt)
    {
        throw logic_error(“Password is too short”)
    }
    …// 必要动作,将一个加密后的密码置入 encrypted 内。

    return encypted;
}

如果函数 encryptPassword 丢出异常,你仍得付出 encrypted 的构造和析构成本。所以最好延后 encrypted 的定义式。直到确定需要它:

// 这个函数延后 “encrypted” 的定义,直到真正需要它
std::string encryptPassword(const std::string& password) 
{
    using namespace std;
    if(password.length() < MinimumPasswordLengt)
    {
        throw logic_error(“Password is too short”)
    }

    string encrypted;
    …//< 必要动作,将一个加密后的密码置入 encrypted 内。

    return encypted;
}

Encrypted 虽获定义却无任何参数作为初值。这意味调用的是 default 构造函数。许多时候你对该对象做的第一个动作就是给它个值,通常通过赋值动作完成。

```cpp
void encrypt(std::string& s);
std::string encryptPassword(const std::string& password) 
{
    using namespace std;
    if(password.length() < MinimumPasswordLengt)
    {
        throw logic_error(“Password is too short”)
    }
    std::string encrypted; //< default-construct encrypted
    encrypted = password; //< 赋值给 encrypted
    encrypt(encrypted);

    return encypted;
}

更受欢迎的做法是以 password 作为 encrypted 的初值,跳过毫无意义的 default 构造函数过程:

std::string encryptPassword(const std::string& password) 
{
    using namespace std;
    if(password.length() < MinimumPasswordLengt)
    {
        throw logic_error(“Password is too short”)
    }
    std::string encrypted(password); //< 通过 copy 构造函数定义并初始化。
    encrypt(encrypted);

    return encypted;
}

“尽可能延后”的意义。不只应该延后变量的定义,直到非得使用该变量的前一刻为止,甚至应该尝试延后这份定义直到能够给他初值参数为止。不仅能避免构造(和析构)非必要对象,还可以避免无意义的 default 构造行为。

对于循环:

//方法A:定义于循环外
Widget w;
for(int i = 0; i < n; i++)
{
    w = 取决于某个i的值;
    //…
}

//方法B:定义于循环内
for(int i = 0; i < n; i++)
{
    Widget w(取决于i的某个值);
    //…
}

做法A:1 个构造 + 1 个析构 + n 个赋值
做法B:n 个构造 + n 个析构

如果 1.赋值成本比 “构造 + 析构” 成本低,2.正在处理效率高度敏感的部分,否则应该使用 B;B 中 w 作用域比 A 中更小,更有利于程序的可理解性和易维护性。

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

相关文章

  • Effective C++ 学习备忘录五

    实现 条款 26 - 尽可能延后变量定义式的出现时间 尽可能延后变量定义式的出现。这样做可增加程序的清晰度并改善程...

  • Effective C++_读书笔记_105

    实现 谨记 80 - 20 原则谨记条款 13: 以对象管理资源 条款26 尽可能延后变量定义式的出现时间 尽可能...

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

    《Effective C++ 中文版 第三版》读书笔记 ** 条款 26:尽可能延后变量定义式的出现实现时间 **...

  • Effective C++学习笔记(第五章)

    条款26:尽可能延后变量定义式的出现时间 考察下面的示例代码: 很显然,这里的myStr提前定义了,并且会带来额外...

  • 实现、继承与面向对象设计

    条款26 尽量延后变量的定义式出现的时间 不仅应该延后变量的定义,更应该直到使用该变量的前一刻为止,甚至应该尝试延...

  • Effective C++ Chapter5-实现

    26、尽可能延后变量定义式的出现时间 条款4曾经解释为什么“通过defailt构造函数构造出一个对象然后对它赋值”...

  • 【Effective C++(5)】实现

    26 尽可能延后变量定义式的出现时间 只要你定义了一个类型带有构造函数和析构函数的变量,当控制流到达这个变量定义式...

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

    变量的定义不仅要尽量延后到使用它的时候,而且要延后到能给该变量初始化赋值的时候。 原因如下:1、只要你定义了一个变...

  • Effective C++ Term 26 延后定义变量

    好处: 避免不必要的开销(构造、析构) 增加代码的可读性 对于循环中,是将变量定义在循环外好,还是循环内好?这个问...

  • linux中的Makefile

    时间:2018-02-26 作者:魏文应 Makefile 的变量 下面是定义makefile: 然后引用变量:...

网友评论

    本文标题:条款 26:尽可能延后变量定义式的出现实现时间

    本文链接:https://www.haomeiwen.com/subject/thkwkxtx.html