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

《Effective C++》

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

只要你定义了一个变量而其类型带有一个构造函数和析构函数,那么当程序的控制流到达这个变量定义式时,你便得承受构造成本;当这个变量离开作用域时,你便得承受析构成本。即使这个变量最终并未被使用,仍需耗费这些成本,所以你应该尽量避免这种情形。

对于“尽可能延后”的理解:

不只应该延后变量多的定义,直到非得使用该变量的前一刻为止,甚至应该尝试延后这份定义直到能够给它初始实参为止。如果这样,不仅能够避免构造(析构)非必要对象,还可以避免无意义的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个析构函数

如果classes的一个赋值成本低于一组构造+析构成本,做法A大体而言比较高效。尤其当n值很大的时候。否则做法B或许较好。

此外,做法A造成名称w的作用域比做法B更大,有时那对程序的可理解性和易维护性造成冲突。因此除非(1)你知道赋值成本比“构造+析构”成本低;(2)你正在处理代码中效率高度敏感的部分。否则你应该选择做法B。

总结:

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

2016-11-07 21:33:24

时间: 2024-10-23 20:59:50

《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") } -//

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

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

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

Effective C++:条款22:将成员变量声明为private

(一)为什么不采用public成员变量 (1)首先,从语法一致性考虑,客户唯一能访问对象的方法就是通过成员函数,客户不必考虑是否该记住使用小括号(). (2)其次,使用函数可以让我们对成员变量的处理有更精确的控制.如果我们令成员变量为public,那么每个人都可以读写它! 但如果我们以函数取得或设定其值,我们就可以实现出"不准访问"."只读访问"以及"读写访问",我们甚至可以实现"惟写访问". class AccessLeve

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

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

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

每个人都有思想.有些人相信自由经济学,有些人相信来生.有些人甚至相信COBOL是一种真正的程序设计语言.C++也有一种思想:它认为潜在的二义性不是一种错误.ambiguity 这是潜在二义性的一个例子: class B; // 对类B提前声明// class A {public: A(const B&); // 可以从B构造而来的类A}; class B {public: operator A() const; // 可以从A转换而来的类B}; 这些类的声明没一点错--他们可以在相同的程序中共存

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

问题: 如何限制类对象的个数?比如1个,10个等等. 方法(1): 将类的构造函数定义为private,那么就无法实例化这个类了.但是如何创建1个对象出来?方法有2种: 1.声明一个友元函数,那么在友元函数中就可以调用构造函数了,创建对象时使用static限制,那么就保证只有一个对象了.类似的定义如下: 1 class Printer 2 { 3 public: 4 friend Printer& thePrinter(); 5 private: 6 Printer(); 7 Printer(c

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

条款26 尽可能延后变量定义式的出现时间(Lazy evaluation) 记住: ★尽可能延后变量定义式的出现.这样做可增加程序的清晰度并改善程序效率 ---------------------------------------------------------------------- 举例说明: std::string encryptPassword( const std::string &password ) { using namespace std; string encrypt