background image


//use c1 here 
return; 
}
上面这段代码中对象 c1 即使在有可能不使用它的情况下也会被创建,这样我们就会为它
付出不必要的花费,有可能你会说一个对象 c1 能浪费多少时间,但是如果是这种情况呢:
C c1[1000];我想就不是说浪费就浪费了。但是我们可以通过移动声明 c1 的位置来改变
这种情况:
void use()
{
if (is_C_Needed() == false) 

return; //c1 was not needed 

C c1; //moved from the block"s beginning 
//use c1 here 
return; 
}
怎么样,程序的性能是不是已经得到很大的改善了呢?因此请仔细分析你的代码,把声
明放在合适的位置上,它所带来的好处是你难以想象的。
(3  

) 初始化列表

我们都知道,初始化列表一般是用来初始化 const 或者 reference 数据成员。但是由于他

 

自身的性质,我们可以通过使用初始化列表来实现性能的提升。我们先来看一段程序:
class Person 
{
private:
C c_1; 
C c_2; 
public:
Person(const C & c1, const C& c2 ): c_1(c1), c_2(c2) {}
};
当然构造函数我们也可以这样写:
Person::Person(const C& c1, const C& c2)
{
c_1 = c1; 
c_2 = c2; 
}
那么究竟二者会带来什么样的性能差异呢,要想搞清楚这个问题,我们首先要搞清楚二
者是如何执行的,先来看初始化列表:数据成员的声明操作都是在构造函数执行之前就
完成了,在构造函数中往往完成的只是赋值操作,然而初始化列表直接是在数据成员声
明的时候就进行了初始化,因此它只执行了一次 copy constructor。再来看在构造函数
中赋值的情况:首先,在构造函数执行前会通过 default constructor 创建数据成员,
然后在构造函数中通过 operator =进行赋值。因此它就比初始化列表多进行了一次函数
调用。性能差异就出来了。但是请注意,如果你的数据成员都是基本类型的话,那么为了