最近對公司代碼進行優化時發現很多類似下面的代碼:
class A
{
public:
A()
{
cout<<"construct A"<<endl;
}
A(const A& a)
{
cout<<"copy construct A"<<endl;
}
int aa;
};
class B
{
private:
A a;
public:
const A GetA()
{
return a;
}
};
GetA返回的一個const A的值,而代碼中經常出現以下測試代碼的調用
int main()
{
B b;
cout<<b.GetA().aa<<endl;
return 0;
}
輸出打印:
construct A
copy construct A
2009095316
而如果把 const A GetA()改爲const A& GetA()
輸出打印:
construct A
2009091650
很明顯,少調用了一次拷貝構造函數,如果A是內置類型或者stl中的迭代器還好,而如果A是個非常複雜的數據結構,這樣就非常的划不來了。
這種問題說出來其實大家都知道,但是每次自己寫的時候或者使用接口的時候未必會注意,當然我這裏只是針對的const value,如果想知道value可以看efffective c++中的條款21。
這裏寫出來只是希望注意一下