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_).
现在在编码过程中,我突然想到“嗯,哪个版本会更快?”,所以更多的是个人兴趣而不是优化。对不起,如果这个问题听起来有点愚蠢,但它有点困扰我,我真的很想知道。感谢您提前提供任何答案!

4

2 回答 2

3

函数调用必须设置一个堆栈帧。if 语句所要做的就是执行一条机器指令。可能有两个,具体取决于机器的架构。

于 2011-03-22T03:19:57.460 回答
1

与 0 的变量比较将比函数调用(通常是单个周期)更快,特别是考虑到必须将变量加载到寄存器中才能进行函数调用。开销包括调整堆栈、压object_入和返回地址、调用函数......

于 2011-03-22T03:29:40.777 回答