0

使用されているメモリサイズが特定のクラスに十分であることを確認するために、配置の新しい演算子をオーバーロードしたいと思います。私たちはこのサイズを知っています。構造は多かれ少なかれこのようになっています:

template <size_t MAXSIZE>
class PlacementNewTest {
public:
  void* operator new (size_t size, void* where)
  {
     if (size > MAXSIZE) {
        throw bad_alloc();
     }
     return where;
  }
};

そのような単純化されたコンテキストで使用されるとしましょう:

char buffer[200];

class A : public PlacementNewTest<sizeof buffer> {
public:
   char a[100];  
};

class B : public A {
public:
   char b[200];  
};


int main() {
   A* a = new (buffer) A; // OK
   a->~A();
   B* b = new (buffer) B; // throwed bad_alloc
   b->~B();
}

テストフェーズでは、このPlacementNewTest <>クラスを使用していますが、リリースコードでは削除することを検討しています。あなたの経験に基づいて、この余分なテストクラスを削除しないで、これは私たちのパフォーマンスにどれくらいの費用がかかると思いますか?これはこの検証の唯一のコストif (size > MAXSIZE)ですか?言い換えると、そのような再定義に対するパフォーマンスのペナルティは何ですか。

class PlacementNewNOP {
public:
  void* operator new (size_t size, void* where)
  {
     return where;
  }
};

たぶん、この質問では重要ではありませんが、これはC ++ 03であり、そうである必要があります。C++11にアップグレードすることはできません。また、ブーストもオプションではなく、C++03だけです。

4

1 に答える 1

1

仮想メソッドを使用していない限り、バインディングは静的である場合を除いて、比較以外にオーバーヘッドはありません。

もちろん、例外のオーバーヘッドがありますが、それは発生してはならないことなので、無視しても問題ありません。

于 2012-08-02T13:12:57.990 に答える