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
{
};
返回值传指针的时候,传基类的指针;而传引用的时候,传子类的对象。由于基类的指针能够指向子类的对象,但子类的指针不能指向父类的对象;子类的对象能够截断为父类的对象,而父类对象不能做为子类对象用。
相关文章
相关标签/搜索