ここで C++ の「placement new」を使用したことがある人はいますか? もしそうなら、何のためですか? 私には、メモリマップされたハードウェアでのみ役立つように思えます。
ベストアンサー1
Placement new を使用すると、すでに割り当てられているメモリ内にオブジェクトを構築できます。
オブジェクトの複数のインスタンスを作成する必要があり、新しいインスタンスが必要になるたびにメモリを再割り当てする必要がない方が高速である場合は、最適化のためにこれを行うことをお勧めします。代わりに、一度にすべてを使用する必要がない場合でも、複数のオブジェクトを保持できるメモリのチャンクに対して単一の割り当てを実行する方が効率的である可能性があります。
DevXは良い例え:
標準 C++ は配置 new 演算子もサポートしており、これは事前に割り当てられたバッファ上にオブジェクトを構築します。これは、メモリ プールやガベージ コレクターを構築するとき、または単にパフォーマンスと例外の安全性が最も重要であるときに役立ちます (メモリがすでに割り当てられているため割り当てが失敗する危険はなく、事前に割り当てられたバッファ上にオブジェクトを構築するのにかかる時間は短くなります)。
char *buf = new char[sizeof(string)]; // pre-allocated buffer
string *p = new (buf) string("hi"); // placement new
string *q = new string("hi"); // ordinary heap allocation
また、クリティカル コードの特定の部分 (たとえば、ペースメーカーによって実行されるコード) で割り当てエラーが発生しないようにしたい場合もあります。その場合は、メモリを早めに割り当て、クリティカル セクション内で placement new を使用します。
配置の割り当て解除新規
メモリ バッファを使用しているすべてのオブジェクトを解放する必要はありません。代わりに、元のバッファのみを delete[] する必要があります。その後、クラスのデストラクタを手動で呼び出す必要があります。これに関する良い提案については、次の Stroustrup の FAQ を参照してください。「配置削除」はありますか??