问题描述
如何使用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 (将#修改为@)