2

このプログラムは形式が正しくありませんか?

#include <new>

struct A
{
  int a;
  int b;
};

struct B
{
  int a;
};

int main()
{    
  void* p(operator new(sizeof(A)));
  new (p) A();
  static_cast<A*>(p)->~A();

  new (p) B();
  static_cast<B*>(p)->~B();

  operator delete(p);
}

ptype に対して正しく整列されることが保証されていることに注意してくださいA。しかし、タイプはBどうですか?規格は何か言及していますか?再調整する標準的な方法はありpますか?

編集:受け入れられた答えにはもっと説明が必要だと思います。operator newそのサイズのオブジェクトに対して正しく配置されたポインターを返す必要がありますが、そのオブジェクトはどのような型になりますか? 認識しない (そしてアラインメントは型に依存する) ため、可能なすべての型のインスタンスに対して適切にアラインされたポインターを提供する必要があります。また、「小さい」型の最大アラインメントは「大きい」型のアラインメントよりも小さいため、ポインターは正しくアラインされている必要があります。

4

2 に答える 2

-2

sizeof 式で A と B の結合を使用すると、純粋主義者だけが文句を言うでしょう。このような:

union AllocObject {
    A a;
    B b;
};

main() {
    char* p = new char[sizeof AllocObject];
    ...
}

ただし、パフォーマンスが気になる場合はnew、次のようにグローバル割り当て演算子を自分で実装することを検討する必要があります。

void* operator new (size_t size) {
    void* result = malloc(size);
    if(!result) throw(bad_alloc());    //Just for standard conformance, unnecessary on Linux...
    return result;
}

void operator delete (void *pointer) {
    free(pointer);
}

もちろん、おそらくもっとうまくやることはできますが、上記のコードでさえ、私のマシンの組み込みバージョンよりも 100 CPU サイクル高速です...

プログラムにリンクされる C++ ファイルにこれを含めるだけで十分であることに注意してください。プログラムがnew演算子を使用するたびに自動的に呼び出されます。

于 2013-07-11T18:02:03.093 に答える