Что быстрее: вызов функции noop или оператор if?


У меня есть указатель функции для deleter, но в большинстве случаев deleter не нужен, только когда я поддерживаю внутреннюю копию чего-то. В настоящее время я делаю это с помощью функции noop deleter:

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_).
Теперь, во время кодирования, мне просто пришло в голову: "Хм, какая версия будет быстрее?", так что это скорее личный интерес, а не оптимизация. Извините, если вопрос звучит глупо, но он меня достает, и я действительно хочу знать. Спасибо за любые ответы заранее!

2 3

2 ответа:

Вызов функции

Должен настроить кадр стека. Все, что нужно сделать оператору if, - это выполнить одну машинную инструкцию. Может быть, два, в зависимости от архитектуры машины.

Сравнение переменной с 0 будет быстрее, чем вызов функции (обычно один цикл), особенно учитывая, что переменная должна быть загружена в регистр, чтобы вызвать функцию в любом случае. Накладные расходы включают в себя настройку стека, нажатие object_ и обратный адрес, вызов функции....