CRTP和虚拟函数开销方法调用

时间:2020-09-27 17:43:31

标签: c++ virtual-functions crtp

如何使用CRTP防止函数调用开销?这些类的细节被省略了,但是我基本上有一个基类A和一些其他类,它们继承自A但实现了从A调用的专用功能。从A继承的类具有一个专用功能,该功能可以重复多次。 (见下文)。在我的基准测试中,CRTP实现与CRTP实现一样快,但比平面类实现慢,即没有继承。这个怎么可能?最初,我使用虚拟函数解决了以下问题:

// VIRTUAL EXAMPLE
class VIRTUAL_A{
  public:
  virtual void do_inner() {};

  void do_stuff(size_t N){
        for (size_t i = 0; i<N ; i++){
            this->do_inner();
        }
  }
};

class VIRTUAL_B : public VIRTUAL_A{
  public:
  void do_inner() override{
    //do heavy computation
  }
};

然后我将其翻译为CRTP:


// CRTP EXAMPLE
template <template T>
class CRTP_A{
  public:
    void do_stuff(size_t N){
        for (size_t i = 0; i<N ; i++){
            static_cast<T&>(*this).do_inner();
        }
    }

 };

class CRTP_B : public CRTP_A<CRTP_B>{
  void do_inner(){
    // heavy computation
  }
};

但是,当我将其与平面课程进行比较时,平面课程的运行速度更快



// FLAT EXAMPLE
class FLAT_A{
  public:
  void do_inner(){
  //heavy computation
}

void do_stuff(size_t N){
  for (size_t i = 0 ; i < N ; i++ ){
    this->do_inner();
    }
  }

};

(省略了类的详细信息)实际基准分数:

enter image description here

任意测试用例的数字以秒为单位。差异是N的函数。

现在我的问题是:

  • CRTP中是否存在运行时函数调用的开销?
  • 我是否在类初始化中缺少某些内容,以便编译器无法以CRTP方法内联派生类?

编辑:: Assemby输出

CRTP类别

enter image description here

平面课程

enter image description here

虚拟课

enter image description here

谢谢!

0 个答案:

没有答案
相关问题