C++ Programming with Performance Consideration

 
對於類能傳引用的就儘量傳引用
1),參數用引用
void Method(const MyClass& aMyClass)
2),返回值用引用
const MyClass& Method()
{
 static MyClass s_MyClass;
 ...
 return s_MyClass;
}
這樣,調用者就可以這樣調用
const MyClass& newMyClass = Method();
比這樣調用省去了MyClass的constructor的開銷:
MyClass newMyClass = Method();
如果我們這樣嘗試:
MyClass Method()
{
 static MyClass s_MyClass;
 ...
 return s_MyClass;
}
const MyClass& newMyClass = Method();
這樣是達不到效果的,是因爲在Method()調用內部,已經調用了MyClass的Copy Constructor把返回值從s_MyClass構造出來。
3),大體而言,返回值傳引用和傳指針Performance效果是差不多的。那什麼時候返回值傳引用,什麼時候傳指針呢?這的確是個問題。指針可以爲NULL,但引用必須指向一個被引用的東西。如果返回值是指針,爲了安全起見,那麼一般程序會這樣調用返回指針的方法:
const MyClass* Method()
{
 if()
  return p; // p is a pointer which is not NULL
 else
  return NULL;
}
const MyClass* pMyClass = Method();
if(!pMyClass)
 ... // Do something, when pMyClass is NULL;
else
 ... // Do something, when pMyClass is not NULL;
 // Like pMyClass->MyClassMethod();
 
但如果是傳引用,必須確保Method()返回值引用到真實的一個變量,並且這個變量不能是函數內部非static變量,因爲函數內部非static變量會因爲函數調用結束而銷燬。
調用者就不需要做類似指針是空值的檢查。
現在看來,好象傳引用更方便些。
但是,從另外一個方面講,返回值傳指針,調用者一般用起來不會引起performance問題,意思是:
如果返回值爲指針,那麼調用者一般會這樣調用:
const MyClass* pMyClass = Method();
// Then use pMyClass do something
如果返回值爲引用,那麼調用者這樣調用最好:
const MyClass& myClass = Method();
但是,一般情況下,大家都習慣於這樣用:
const MyClass myClass = Method();
這樣一用,Peformance就會差一些。
所以從這個角度上講,好象返回值傳指針更好。
但是話又說回來了,即使返回值傳指針,調用者也可以這樣用:
const MyClass myclass = *(Method());
這樣的話,Performance會一樣差,因爲同樣一個新的MyClass對象會構造出來。
所以總結一下,返回值傳引用和傳指針,不能一概而論,還是要具體情況具體分析。
4).如果存在類繼承關係,情況會略顯複雜。
比如:
class BaseClass
{
};
class DerivedClass: public BaseClass
{
};
返回值傳指針的時候,傳基類的指針;而傳引用的時候,傳子類的對象。因爲基類的指針可以指向子類的對象,但子類的指針不能指向父類的對象;子類的對象可以截斷爲父類的對象,而父類對象不能作爲子類對象用。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章