转换C ++层次结构以使用静态多态性

时间:2012-03-10 22:06:05

标签: c++ optimization polymorphism virtual-functions crtp

我有以下类层次结构(实际上还有更多的类),我想知道是否有可能重组以下内容以利用静态多态性?

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;
};

我问过,在完成大量的分析之后,虚拟方法调用的开销实际上非常大,并且希望尽可能地优化它。

1 个答案:

答案 0 :(得分: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等的作用。这里的区别是,即使访问多个函数,您也只需要切换一次 - 相当于单个虚拟调度。