2011-03-22 27 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_和返回地址,调用函数....

相关问题