3

私はデリータの関数ポインタを取得しましたが、ほとんどの場合、何かの内部コピーを維持する場合にのみ、デリータは必要ありません。現在、私はヌープ削除関数でそれを行います:

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 文で実行する必要があるのは、1 つの機械語命令を実行することだけです。マシンのアーキテクチャにもよりますが、おそらく2つです。

于 2011-03-22T03:19:57.460 に答える
1

0 に対する変数の比較は、関数呼び出し (通常は 1 サイクル) よりも高速です。特に、関数呼び出しを行うために変数をレジスタにロードする必要がある場合は特にそうです。オーバーヘッドには、スタックの調整、プッシュobject_とリターンアドレス、関数の呼び出しが含まれます....

于 2011-03-22T03:29:40.777 に答える