版权声明:转载请注明出处,谢谢!!! 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