2016-01-03 22 views
1

我正在學習如何將C++編譯爲彙編程序,並且我發現異常在引擎蓋下非常有趣。如果可以擁有多於一條執行路徑,那麼爲什麼不用於普通函數呢?跳轉作爲RTTI的替代者

例如,假設你有一個可以返回一個指向A級或A派生方式的東西功能時,您應該做的是與RTTI。

但是,爲什麼不,相反,有被調用的函數,計算返回值後,跳轉回調用函數到與返回類型配襯了具體位置。就像例外情況一樣,執行流程可以正常進行,或者如果拋出,它會落入您的一個捕獲處理程序中。

這裏是我的代碼:與RTTI和dynamic_cast會檢查,爲什麼不讓富功能只是跳轉到相應的位置,主要做的

class A 
{ 
public: 
    virtual int GetValue() { return 0; } 
}; 

class B : public A 
{ 
public: 
    int VarB; 
    int GetValue() override { return VarB; } 
}; 

class C : public A 
{ 
public: 
    int VarC; 
    int GetValue() override { return VarC; } 
}; 

A* Foo(int i) 
{ 
    if(i == 1) return new B; 
    if(i == 2)return new C; 
    return new A; 
} 

void main() 
{ 
    A* a = Foo(2); 

    if(B* b = dynamic_cast<B*>(a)) 
    { 
     b->VarB = 1; 
    } 
    else if(C* c = dynamic_cast<C*>(a)) // Line 36 
    { 
     c->VarC = 2; 
    } 
    else 
    { 
     assert(a->GetValue() == 0); 
    } 
} 

所以不是。所以在這種情況下,Foo返回一個指向C的指針,Foo應該直接跳轉到第36行。

請告訴我問題呢?爲什麼人們不這樣做?是否有性能原因?我認爲這會比RTTI更便宜。

或者這只是一個語言限制,不管它是一個好主意或沒有?

+0

請告訴我爲什麼你只是沒有學習C++?彙編語言正在潛入微觀優化中,並且由於失去了更大的圖像而存在許多問題 –

+3

說實話,需要知道返回的指針的確切類型會破壞多態性,因此它是您應該很少需要的東西(儘管有時不可避免) 。 * best *解決方案是從返回的指針調用*虛函數*,並讓對象決定要運行的代碼。 – Galik

+0

也許我的示例代碼不是最好的,但我想知道的是爲什麼函數只有一條路徑。由於程序集允許我們做更多的事情,爲什麼C++不給我們一個簡單的方法來控制函數返回路徑。 – taher1992

回答

0

首先,有百萬個不同的定義語言的方式。 C++被定義爲定義。不錯或不是很重要。如果你想改進語言,你可以自由地向C++委員會寫一個提案。他們會審查它,並可能包含在未來的標準中。有時會發生。其次,儘管在例外情況下進行了調查,但沒有什麼理由認爲這比使用RTTI的手寫代碼更有效。異常調度仍然需要CPU週期。那裏沒有奇蹟。真正的區別在於,使用RTTI時,您需要自己編寫代碼,而編譯器會爲您生成異常調度代碼。

您可能想要調用您的函數10000次,並找出運行得更快的代碼:基於RTTI的代碼或異常分派。