【问题标题】:What is faster: noop function call or if statement?什么更快:noop 函数调用或 if 语句?
【发布时间】:2011-03-22 03:16:43
【问题描述】:

我得到了一个删除器的函数指针,但大多数时候,删除器是不需要的,只有当我维护某个东西的内部副本时。目前我使用 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,并使用if(deleter_ != 0) (*deleter_)(object_) 签入Cleanup 函数。
现在在编码过程中,我突然想到“嗯,哪个版本会更快?”,所以更多的是个人兴趣而不是优化。对不起,如果这个问题听起来有点愚蠢,但它有点困扰我,我真的很想知道。感谢您提前提供任何答案!

【问题讨论】:

  • 任何“哪个更快”问题的答案都是衡量它。变量太多,很难得出一般性结论。尤其是测试这两种可能性实际上比在论坛上提问更容易!

标签: c++ if-statement function-call


【解决方案1】:

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

【讨论】:

  • 并获取函数指针,处理参数,从无操作函数返回...
  • 并且可能使用 RET 指令对内存进行页面错误。 :)
  • 一个空函数需要多少堆栈帧?没有任何? if 语句也必须处理指针,所以我认为你不会在那里节省太多。 @Xeo:只需测量一下,然后告诉我们差异是 1 纳秒还是 2 纳秒!
【解决方案2】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-19
    • 2012-09-20
    • 2023-03-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    相关资源
    最近更新 更多