2012-07-26 50 views
0

這是一個純粹好奇的問題,我不認爲答案可能會導致很大的改進。鑄造一個對象兩次vs一次表演

讓我們假設有這種樹的繼承:

  A 
     /\ 
     / \ 
     AB  AC 
     /\  /\ 
    ABB ABC ACB ACC 

我要編寫一個執行型動物的行爲基礎上的對象類型的函數。 我100%確定這個對象只能是一個AC對象或它的一個子對象。

現在它的代碼是更快:

int t = getObjectType(); 
A* obj = getObject(); 
switch (t) { 
     case 0: 
     ACB* casted_obj = static_cast<ACB*>(obj); 
     case 1: 
     ACC* casted_obj = static_cast<ACC*>(obj); 
} 

int t = getObjectType(); 
A* sup = getObject(); 
AC* obj = static_cast<AC*>(sup); 
switch (t) { 
     case 0: 
     ACB* casted_obj = static_cast<ACB*>(obj); 
     case 1: 
     ACC* casted_obj = static_cast<ACC*>(obj); 
} 

或許C++標準不說如何繼承樹必須管理什麼,所以答案取決於實現。

+0

這兩個代碼都是*錯誤*:你忘了'break'。 – kennytm 2012-07-26 13:41:22

+0

此外,[你不能在開關中聲明變量](http://stackoverflow.com/q/92396/912144),但我們得到的主旨。 – Shahbaz 2012-07-26 13:44:29

回答

2

靜態轉換完全在編譯時完成,因此性能影響將始終爲零。在運行時唯一完成的類型是dynamic_cast。更多:http://www.cplusplus.com/doc/tutorial/typecasting/

+0

這不是事實。例如,如果有多個基類,則'static_cast'可以改變指針的值。 – 2012-07-26 14:40:41