替代虛函數我有一個基類中定義的昂貴功能,它依賴於低電平信息從它的派生類:如果我正確理解事物模板如在C++
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();
}
};
,事實低級函數是虛擬的,可以防止它在上面的代碼中被內聯。現在,我在想一個辦法來解決這個問題,並在下述溶液,想到這裏我傳遞一個指向派生類的成員函數作爲模板參數:
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>();
}
};
這是否戰略意義?我想象當在派生類中擴展昂貴的基類函數時,低級操作將被內聯。
我測試過實現它,它編譯和工作,但我沒有看到任何明顯的性能差異。
親切的問候, 喬爾
*這個策略是否有意義?*否 – 2012-02-11 12:24:33
*我想當在派生類中擴展昂貴的基類函數時,將會內聯低級操作。*您是否檢查了程序集? – jpalecek 2012-02-11 12:30:14
在昂貴的功能中獲得對「a」的引用是否是一種選擇? – 2012-02-11 12:44:39