[英]Polymorphic behaviour without virtual
我這是一個很好的實現,這個簡單的繼承不使用任何虛函數。
為什么我想要這樣:避免在性能關鍵代碼中進行虛擬繼承。 boost :: variant肯定可以幫到這里,但我只想要標准的c ++東西:-)
我也參考這個答案鏈接
#include <iostream>
using namespace std;
struct C;
struct B;
class A{
public:
A(int r): type(r){}
int type;
void deleter();
protected:
~A(){std::cout << "DTOR A" << std::endl;}
};
class B: public A{
public:
B():A(1){};
~B(){std::cout << "DTOR B" << std::endl;}
};
class C: public A{
public:
C():A(2){};
~C(){std::cout << "DTOR B" << std::endl;}
};
void A::deleter(){
if(type==1){
delete static_cast<B* const>(this);
}else if(type==2){
delete static_cast<C* const>(this);
}
}
int main(){
A * a = new B();
a->deleter();
}
我想使用基指針a
。 主要問題是當我們要delete a
時要做什么。 我只是通過使A
的DTOR
受到保護來禁止它。 因此,使用此構造的唯一方法是調用a.deleter()
以安全地刪除bas類指針。 這是安全的,是一個很好的實現還是有更好的方法?
您引用了一條指南“避免在性能標准代碼中使用虛擬繼承”。 這不是一個糟糕的指導方針,但它不是最好的措辭。
真正的規則是“ 避免性能嚴重代碼中的運行時多態性 ”。 運行時多態性會導致性能下降。 如果編譯器不知道提前調用的確切函數,則無法跨函數進行優化。 (分支預測有所幫助,但仍遠不及內聯依賴的優化)
要獲得高性能和多態性,請在任何循環之外提升多態性。 如果唯一的多態調用是針對大型操作的,那么您不會經常支付多態性的代價。
模板(編譯時多態)可以幫助組成小型操作而無需重復代碼。 然后使用動態調度技術選擇一個高度優化的模板實例。 那時你使用的動態調度技術並不重要。 虛擬調用,在std::function
鍵入擦除,或者您自己的函數指針表。 因為動態調度操作與實際工作相比較小。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.