如何解决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();
}
}
};
(省略了类的详细信息)实际基准分数:
任意测试用例的数字以秒为单位。差异是N的函数。
现在我的问题是:
编辑:: Assemby输出
CRTP类别
平面课程
虚拟课
谢谢!
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。