1. ホーム
  2. c++

[解決済み] 配置換え」にはどんな使い方があるのか?

2022-03-21 21:35:45

質問

C++の"placement new"を使ったことがある方はいらっしゃいますか?もしあれば、何のために?メモリマップドハードウェアにしか使えないような気がするのですが。

どのように解決するのですか?

Placement new を使用すると、すでに割り当てられているメモリ内にオブジェクトを構築することができます。

あるオブジェクトの複数のインスタンスを作成する必要があり、新しいインスタンスが必要になるたびにメモリを再割り当てしない方が高速になる場合、最適化のためにこの方法をとることがあります。 その代わりに、複数のオブジェクトを格納できるメモリの塊に対して、一度にすべてを使用しないまでも、一度に割り当てを行う方が効率的な場合があります。

DevXでは 良い例 :

標準C++は、配置もサポートしています。 新規演算子で オブジェクトをあらかじめ確保されたバッファ上に作成します。これは は、メモリプールを構築する際に有効です。 ガベージコレクタを使用する場合、あるいは単に パフォーマンスと例外安全性が の危険性がない)ことが最も重要です。 を使用するため、メモリ割り当てに失敗します。 はすでに割り当てられており オブジェクトを構築する 事前に確保されたバッファは、より短い時間を必要とします。)

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を使用します。

placement new でのデアロケーション

メモリバッファを使用しているすべてのオブジェクトの割り当てを解除するべきではありません。 その代わり、元のバッファだけを削除[]する必要があります。 その場合、クラスのデストラクタを手動で呼び出さなければなりません。 これに関する良い提案は、StroustrupのFAQを参照してください。 placement delete".はありますか? ?