1

私のアプリケーションでは、構造体に特殊なケースを導入することで、約 2 倍のスピードアップを達成しました。

単純化すると、私のコードは次のようになります。

class SpecialCase
{
   private:
      size_t values[10];
   public:
      void foo();
};

class GenericCase
{
   private:
      std::vector<size_t> values;
   public:
      void foo();
};

template <class Case> void bar()
{
   Case case;
   case.foo();
}

void somewhereElse()
{
   if ( boring_runtime_condition )
   {
      bar<SpecialCase>();
   }
   else
   {
      bar<GenericCase>();
   }
}

このコードには問題はありませんが、別のクラスでアプリケーションを拡張する必要があります。

class Problem
{
   private:
      std::vector<Case> cases;
   public:
      Case doSomething();
};

SpecialCase と GenericCase の両方を使用するには、クラス全体をテンプレートにする必要があります。いくつかの特殊なケースがあるため、これによりコンパイルが大幅に遅くなります。私はそれがまったく好きではありません。

アプリケーションの実行中に SpecialCase と GenericCase を混在させることはありません。コードが肥大化し、他の開発者がそれを忘れる可能性があるため、すべてのメソッドでCase を特定の型にキャストする必要はありません。

このテンプレートの狂気を回避する良い方法はありますか? (C++11 ソリューションも大歓迎です)

免責事項: がどれだけ優れているかstd::vector、特別なケースを使用すべきではないなどとは言わないでください。パフォーマンスを測定したので、2 倍のスピードアップを信じないというコメントを残さないでください。それは事実であり、この質問はそれについてではありません。

4

1 に答える 1

0

の多くのインスタンスを作成したくない場合はstd::vector、参照によってすべてを格納し、このクラスでのみキャストする小さなプロキシ クラスを作成できます。小さい場合、インスタンス化はそれほど遅くはありません。

template<class T>
class Problem {
    private:
        std::vector< some_smart_pointer > cases;
    public:
        T cast(Case* x) {
             return (T*)x;
        }
        T doSomething() {
             //doing something
              return cast(returnValue);
        }
};

クラスを呼び出しましたが、プロキシとしてのみ使用されるProblem別のレイヤーを作成して使用することをお勧めしますProxyVectorProblem

于 2013-03-09T13:31:59.747 に答える