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

版权声明:转载请注明出处,谢谢!!! https://blog.csdn.net/qhdhnbd110/article/details/83041880

你可能觉得你不可能不使用一个定义过的东西,考虑下面的情形:

void SomeFunc(int a, int b, std::string &SomeString)
{
    std::string Temp;
    if(a < b)
        return;
    //...
    //关于Temp的操作
    //...
}

如果a<b,那么函数直接退出,但是局部变量Temp已经经历了自身的默认构造,退出时又经历了析构函数,但这是没有必要的 。

所以,我们尽量在不得不使用它的时候再去定义它:

void SomeFunc(int a, int b, const std::string &SomeString)
{
    if(a < b)
        return;
    std::string Temp;
    Temp = SomeString;
    //...
    //关于Temp的操作
    //...
}

此段代码效率还是有点低下,因为我们在条款04中说过,直接调用拷贝构造函数定义并初始化比先调用默认构造函数再调用copy assignment操作符要快,所以,上面的代码优化为:

void SomeFunc(int a, int b, const std::string &SomeString)
{
    if(a < b)
        return;
    std::string Temp(SomeString);
    //...
    //关于Temp的操作
    //...
}

这就是“尽可能延后的意义”,但是,你不只要尽可能延后到使用这个变量之前,而是要尽可能延后到能给这个变量初值的时候,这样还可以避免无意义的default构造。

对于循环来说:

//循环A
SomeClass A;
for(int i = 0; i < n; i++)
{
    A = ...;
}
//循环B
for(int i = 0; i < n; i++)
{
    SomeClass A(...);
}

对于循环A,成本为:一次构造+一次析构+n个赋值操作

对于循环B,成本为:n次构造+n次析构

一般来说,循环A的代码更高效一些,但由于将对象声明在了循环外面,扩大了对象的作用域,可能对代码维护性与理解上带来了麻烦。

所以:如果

(1). 你确定A的效率比B的效率高

(2). 代码对效率高度敏感

选择循环A,否则选择循环B

猜你喜欢

转载自blog.csdn.net/qhdhnbd110/article/details/83041880