0

私は次のクラス階層を持っています(実際にはもっとたくさんのクラスがあります)、静的ポリモーフィズムを利用するために次を再編成することは可能かどうか疑問に思いましたか?

struct return_val {};

struct base
{
   virtual ~base(){}
   virtual return_val work(){};
};

struct derivedtype1 : public base
{
   return_val work() { return localwork(next_type.work()); }
   return_val localwork(return_val& rv0){....}
   base* next_type0;
};

struct derivedtype2 : public base
{
   return_val work() { return localwork(next_type0.work(),next_type1.work()); }
   return_val localwork(return_val& rv0, return_val& rv1){....}
   base* next_type0;
   base* next_type1;
};

struct derivedtype3 : public base
{
   return_val work() { return localwork(next_type0.work(),next_type1.work(),next_type2.work()); }
   return_val localwork(return_val& rv0, return_val& rv1, return_val& rv2){.....}
   base* next_type0;
   base* next_type1;
   base* next_type2;
};

大量のプロファイリングを行った後、仮想メソッド呼び出しによるオーバーヘッドは実際には非常に大きく、可能な限り最適化することを望んでいたので、私は尋ねます。

4

1 に答える 1

2

あなたは 18% の vf 呼び出しオーバーヘッドに言及しているため、各クラスに多くの仮想関数を想定しています。その場合、これを試すことができるかもしれません:

base * pObj;
switch(pObj->getTypeIdentifier())
{
  case 1:
    static_cast<derivedtype1*>(pObj)->func1;
    static_cast<derivedtype1*>(pObj)->func2;
    ...

  case 2:
    static_cast<derivedtype2*>(pObj)->func1;
    static_cast<derivedtype2*>(pObj)->func2;
    ...
}

これは基本的に、各 func1、func2 などに対して仮想ディスパッチが行うことです。ここでの違いは、複数の関数にアクセスする場合でも、一度だけ切り替える必要があることです。単一の仮想ディスパッチと同等です。

于 2012-03-30T12:28:10.093 に答える