Что быстрее: вызов функции noop или оператор if? - PullRequest
3 голосов
/ 22 марта 2011

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

Ответы [ 2 ]

3 голосов
/ 22 марта 2011

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

1 голос
/ 22 марта 2011

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...