Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/159.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 转换C++;使用静态多态性的层次结构_C++_Optimization_Polymorphism_Virtual Functions_Crtp - Fatal编程技术网

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

C++ 转换C++;使用静态多态性的层次结构,c++,optimization,polymorphism,virtual-functions,crtp,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_v

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

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

在做了大量分析之后,我问,虚拟方法调用的开销实际上相当大,我希望尽可能地优化它。

因为您提到了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;
    ...
}
base*pObj;
开关(pObj->getTypeIdentifier())
{
案例1:
静态(pObj)->func1;
静态投影(pObj)->func2;
...
案例2:
静态(pObj)->func1;
静态投影(pObj)->func2;
...
}

这基本上就是虚拟分派对每个func1、func2等所做的操作。这里的区别是,即使访问多个函数,也只需切换一次—相当于单个虚拟分派。

非常简单:您知道编译时的最终类型吗?然后可以使用一些静态泛型。如果你不这样做,你就需要运行时多态性,而且没有办法。@ Kerrek:你可能是对的,运行时间就是我所要寻找的,但是我希望有一个秘密的C++技巧或者一些可以在VF调用开销中得到解决的东西。它很小,除非您有非常严格的性能要求,否则基本上不会被注意到。@Xeo:对于我正在处理的当前任务来说,它是显而易见的,开销大约是总计算时间的18%。我已经尝试过重构代码,以使vf调用的数量最少,因此目前vf开销是下一个需要考虑的问题……我不确定您如何分析代码以获得18%的数量(相对于您正在进行的vf调用的数量,您的计算必须做很少的工作!),你有没有看过以下帖子中的答案: