2011-03-22 64 views
3

我得到了一個刪除器的函數指針,但大多數時候,刪除器不會被需要,只有當我維護一個內部副本的東西。目前,我這樣做,有一個空操作,刪除器功能:速度更快:noop函數調用還是語句?

class MyClass{ 
public: 
    // bind object 
    template<class Type> 
    void Bind(Type* obj){ 
    Cleanup(); 
    object_ = obj; 
    } 

    // bind object with internal copy 
    template<class Type> 
    void Bind(Type obj){ 
    Cleanup(); 
    object_ = new Type(obj); 
    deleter = &Deleter<Type>; 
    } 

private: 
    template<class Type> 
    static void Deleter(void* obj_ptr){ 
    Type* obj = static_cast<Type*>(obj_ptr); 
    delete obj; 
    } 

    static void NoopDeleter(void* unused){ 
    } 

    void Cleanup(){ 
    (*deleter_)(object_); 
    object_ = 0; 
    deleter_ = &NoopDeleter; 
    } 

    typedef void (*DeleterFunc)(void*); 

    void* object_; 
    DeleterFunc deleter_; 
}; 

現在明顯的另一個選擇是將其設置爲0在不需要的時候,而在Cleanup功能檢查與if(deleter_ != 0) (*deleter_)(object_)
現在編碼過程中,我想到「嗯,哪個版本會更快?」,所以它更多的是個人興趣而不是優化。對不起,如果這個問題聽起來有點愚蠢,但它有點蟲子我,我真的想知道。提前感謝任何答案!

+3

任何問題「哪個更快」的答案是測量它。有很多變數,很難得出一般結論。特別是在測試這兩種可能性時,實際上比在論壇上提問更容易! – 2011-03-22 03:29:49

回答

3

函數調用必須設置堆棧幀。所有的if語句必須執行一條機器指令。也許兩個,取決於機器的結構。

+0

並獲取函數指針,並處理參數,並從無操作函數返回... – 2011-03-22 03:28:24

+0

並可能使用RET指令對頁面進行頁面錯誤。 :) – Vagrant 2011-03-22 03:50:13

+0

你需要一個空的函數多少個stackframe?沒有? if語句也必須處理指針,所以我認爲你不會在那裏節省很多。 @Xeo:只要做一下測量,並告訴我們,如果差異是1或2納秒! – 2011-03-22 08:05:01

1

與0比較的變量比函數調用(通常是單個循環)要快,特別是考慮到必須將變量加載到寄存器以進行函數調用。開銷包括調整堆棧,按object_和返回地址,調用函數....