我在基类中定义了一个昂贵的函数,它依赖于派生类的低级信息:
class BaseClass{
...
// Defined in derived class
virtual int low_level(int)=0;
// Expensive function depending on the pure virtual function
void myExpensiveFunction(){
for(...){
for(...){
for(...){
... = low_level(...);
...
}
}
}
}
};
class DerivedClass : public BaseClass{
// A very cheap operation that can be inlined:
inline virtual int low_level(int i){
return a[i];
}
// Calling the base class function
void test(){
myExpensiveFunction();
}
};
Run Code Online (Sandbox Code Playgroud)
如果我理解正确,那么低级函数是虚拟的这一事实可以防止它在上面的代码中被内联.现在,我正在考虑一种解决此问题的方法并考虑以下解决方案,其中我将指向派生类成员函数的指针作为模板参数传递:
class BaseClass{
...
// The function is now templated by the derived function:
template<typename D, int (D::*low_level)(int)>
void myExpensiveFunction(){
for(...){
for(...){
for(...){
... = static_cast<D*>(this)->low_level(...);
...
}
}
}
}
};
class DerivedClass : public BaseClass{
// A very cheap operation that can be inlined:
inline int low_level(int i){
return a[i];
}
// Calling the base class function
void test(){
myExpensiveFunction<DerivedClass,&DerivedClass::low_level>();
}
};
Run Code Online (Sandbox Code Playgroud)
这种策略有意义吗?我想,当在派生类中扩展昂贵的基类函数时,将内联低级操作.
我测试了它的实现并编译和工作,但我没有看到任何明显的性能差异.
亲切的问候,乔尔
| 归档时间: |
|
| 查看次数: |
1443 次 |
| 最近记录: |