簡體   English   中英

沒有虛擬的多態行為

[英]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時要做什么。 我只是通過使ADTOR受到保護來禁止它。 因此,使用此構造的唯一方法是調用a.deleter()以安全地刪除bas類指針。 這是安全的,是一個很好的實現還是有更好的方法?

http://ideone.com/pd88xy

您引用了一條指南“避免在性能標准代碼中使用虛擬繼承”。 這不是一個糟糕的指導方針,但它不是最好的措辭。

真正的規則是“ 避免性能嚴重代碼中的運行時多態性 ”。 運行時多態性會導致性能下降。 如果編譯器不知道提前調用的確切函數,則無法跨函數進行優化。 (分支預測有所幫助,但仍遠不及內聯依賴的優化)

要獲得高性能和多態性,請在任何循環之外提升多態性。 如果唯一的多態調用是針對大型操作的,那么您不會經常支付多態性的代價。

模板(編譯時多態)可以幫助組成小型操作而無需重復代碼。 然后使用動態調度技術選擇一個高度優化的模板實例。 那時你使用的動態調度技術並不重要。 虛擬調用,在std::function鍵入擦除,或者您自己的函數指針表。 因為動態調度操作與實際工作相比較小。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM