微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

如何解决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

谢谢!

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。