我正在學習如何將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更便宜。
或者這只是一個語言限制,不管它是一個好主意或沒有?
請告訴我爲什麼你只是沒有學習C++?彙編語言正在潛入微觀優化中,並且由於失去了更大的圖像而存在許多問題 –
說實話,需要知道返回的指針的確切類型會破壞多態性,因此它是您應該很少需要的東西(儘管有時不可避免) 。 * best *解決方案是從返回的指針調用*虛函數*,並讓對象決定要運行的代碼。 – Galik
也許我的示例代碼不是最好的,但我想知道的是爲什麼函數只有一條路徑。由於程序集允許我們做更多的事情,爲什麼C++不給我們一個簡單的方法來控制函數返回路徑。 – taher1992