2017-03-01 103 views
-1

我已經看到了很多示例如何使函數指針指向類類型的特定的C++類非靜態成員。不過,我會用這樣的指針,它可以用於任何類型的類。爲了證明這個想法,我寫了一個僞示例:指向任何類類型的非靜態成員函數的C++函數指針

class A 
{ 
    public: 
    A(){} //constructor  
    void callMe() { /* do something */ } 
}; 

class B 
{ 
    public: 
    B(){} //constructor  
    void callMe() { /* do something */ } 
}; 


main() 
{ 
    A aa; 
    B bb; 

    //pseudo part: 
    generic_method_pointer_type p; //how to define the type of p? 

    p=HOWTO;//set pointer p to point to A::callMe. How to do? 

    p(aa); //A::callMe on instance aa gets called 

    p=HOWTO;//set pointer p to point to B::callMe. How to do? 

    p(bb); //B::callMe on instance bb gets called 
} 

這看起來可能嗎?

我知道C++ 11有一些新的技巧,例如std :: function。我在std :: function上做了一些實驗,發現它對於運行在小型微控制器上的實時應用程序太慢了。這就是爲什麼我寧願直接硬編碼指針,這會導致最小的開銷。

謝謝您的建議!

+0

您是否閱讀過您提供的標籤,特別是在成員函數指針下的帖子? –

+0

在網上搜遍了幾個小時。如果你知道一個答案的鏈接,我會很感激。 – TeroK

+1

如果你設置'p =&A :: callMe;'然後做'p(bb);'',你會發生什麼? – aschepler

回答

0
從MBED項目源代碼(其FunctionPointer類)

找到一個完美工作溶液:

工作實施例:

A foo; 
FunctionPointer cb; 
cb.attach(&foo,&A::callMe); 
for(i=0;i<100000000;i++) //callback overhead test 
    cb.call(); 

FunctionPointer中的代碼對我來說不是很明顯,它是如何工作的。它memcpy一些數據等任何想法,如果它可以簡化&做得更快?它還是引起顯著更多的開銷相比,在類類型是固定的情況下,如:

A foo; 
typedef void (A::*MethodPtr)(); 
MethodPtr method = &A::callMe; 
Foo *obj = &foo; 
for(i=0;i<100000000;i++) //callback overhead test 
    (obj->*method)(); 

上述方法是約4倍更快相比FunctionPointer方法時的CallMe只含有ASM(「NOP」)。

  • 直接調用205毫秒
  • 上面的函數指針例如258毫秒
  • FunctionPointer例如1049毫秒
  • 的std ::函數3951毫秒

任何:在x86 & GCC一些性能測試優化的想法非常感謝!

+0

看看'FPointer',你可以去掉所有的'c_callback',因爲你總是有一個對象,如果你相信自己所有的空指針檢查。這裏發生的事情就是我上面提到的「所有類型的安全都在窗外」。你可以打包任何你想要的東西,然後祈禱你明白了,因爲編譯器不能幫你。 – user4581301

+0

發現MBED回調類可以更有效地實現這一點,但不是非常顯着的性能差異。在900毫秒左右運行測試。取消檢查也可以節省幾毫秒。 – TeroK