2009-02-25 4 views
7

The CRTPは、動的多型に関するこの質問に示唆されています。しかし、このパターンは静的多型にのみ有用であると言われています。私が見ているデザインは、仮想関数呼び出しによってスピードワイドに妨げられているようです。hinted at here. 2.5倍のスピードアップも素晴らしいでしょう。C++で多態性に代わる方法がありますか?

問題のクラスは単純で完全にインラインでコーディングできますが、実行時まではクラスが使用されません。さらに、それらは、いかなる順序でも、傷害への性能を傷つけることができる。

どのような提案(この場合CRTPをどのように使用できるかを含む)は歓迎します。

編集:グーグルでは、機能テンプレートに言及しています。これらは有望です。

答えて

3

私は、あなたが実行時の多型を避けるつもりはないとm-sharpに同意します。

あなたは優雅上での最適化を重視した場合、

void invoke_trivial_on_all(const std::vector<Base*>& v) 
{ 
    for (int i=0;i<v.size();i++) 
    { 
    if (v[i]->tag==FooTag) 
     static_cast<Foo*>(v[i])->Foo::trivial_virtual_method(); 
    else if (v[i]->tag==BarTag) 
     static_cast<Bar*>(v[i])->Bar::trivial_virtual_method(); 
    else... 
    } 
} 

のようなものを持って言う

void invoke_trivial_on_all(const std::vector<Base*>& v) 
{ 
    for (int i=0;i<v.size();i++) 
    v[i]->trivial_virtual_method(); 
} 

を交換してみてくださいそれは確かにないOOP(より多くのあなたが古き良きでやるかもしれないものへの復帰、きれいではありません'C')でも、仮想メソッドが十分であれば、呼び出しのない関数を得るべきです(十分なコンパイラ&最適化オプションの対象)。dynamic_castまたはtypeidを使用するバリアントは、ややエレガントで安全かもしれませんが、これらの機能にはオーバーヘッドがあり、これはおそらく仮想呼び出しに匹敵します。

いくつかのクラスメソッドがno-opsであり、呼び出しからあなたを救った場合、または関数に共通のループ不変コードが含まれていて、オプティマイザがホイストを管理している場合それはループの外に出ます。

+1

私はテンプレートのif文がこの混乱を少しきれいにするかもしれないと信じています。とにかく有望に見えます。 – casualcoder

+0

reinterpret_cast <>の代わりにstatic_cast <>を使用してください。後者は特定のケースで誤った結果を表示します(典型的な実装では、FooやBarに複数の基本クラスがあり、 –

+0

良い点ありがとうございます。回答が更新されました。 – timday

18

多形は、文字通り、複数の(ポリ)形態(モーフ)を意味する。静的型付き言語(C++など)には、3種類の多型があります。

  1. アドホック多型:これは、関数とメソッドのオーバーロードとしてC++で最もよく見られます。同じ関数名は、コンパイル時間の関数またはメソッドシグネチャの呼び出しのパラメータの型に一致することに基づいて、異なるメソッドにバインドされます。
  2. パラメトリック多形性:これはテンプレートであり、CRTP、特殊化、部分的な特殊化、メタプログラミングなどのテンプレートとすべての楽しいことです。同じテンプレート名で異なることができるこの種のポリモーフィズムは、のコンパイル時間多型です。
  3. サブタイプ多型:最後に、これはC++で多型という言葉を聞いたときに考えています。これは、派生クラスが動作を特化する仮想関数をオーバーライドする場所です。基本クラスに対する同じ型のポインタは、それが指している具体的な派生型に基づいて異なる動作を持つことができます。これは、ランタイム多態性をC++で得る方法です。

ランタイムまでにクラスが使用されていない場合は、仮想関数呼び出しに関連するサブタイプ多態性を使用する必要があります。

仮想メソッド呼び出しは、静的にバインドされた呼び出しよりもパフォーマンスオーバーヘッドが非常に小さい。私はあなたにこの答えを見るように促したいと思います。SO question.

-1

あなたはOle Cルートに行き、組合を使うことができます。それも面倒です。

+1

私はこの3回を「タマネギ」と読んで、あなたの「厄介な」ワークフローがどのようなものかを想像できました。 –

関連する問題