1

グローバルな配置を置き換えることはできませんが、新しい配置のクラス固有のバージョンを提供できます。クラスが独自の配置 new 演算子を提供する必要があるシナリオには、どのようなものがありますか?

私のクラスがplacement newを実装していなくても、次のコードは機能します(abcの演算子newがオーバーロードされていないと仮定します)。

char arr[100];

abc *pt = new(&arr)abc; 

だから私は解釈します、いくつかのデフォルトの配置 new がありますが、クラスには独自のバージョンの演算子 new を提供できます。私の質問は、そのユースケースは何ですか? 渡された同じポインタを返す以外に何をすべきですか? 遭遇した有用な例/シナリオはありますか?

4

4 に答える 4

1

クイズの質問のようですね...

より高速で無駄のない割り当て
最も一般的な理由は、動的に割り当てる必要のある小さなオブジェクトがたくさんあることです。固定サイズのオブジェクト用のカスタムアロケータは、一般的なアロケータよりも割り当てのオーバーヘッドがはるかに少なく、断片化の影響を受けず、通常は高速です。(また、これらの割り当てがメインヒープから削除されると、メインヒープの断片化には寄与しなくなります)。

同様に、非解放アロケータ(複数のオブジェクトを割り当てることはできますが、それらを一緒に解放することはできませんが、組み合わせてのみ)は、可能な限り最速の割り当てスキームであり、オーバーヘッドはありません(まれなケースでの配置を除く)。変更せず、全体として削除するだけのデータ構造を構築している場合は、理にかなっています。

他のベースアロケータ
別のアプリケーションは、C++ヒープとは異なるヒープから割り当てています。オブジェクト内のデータは、他のプロセスと交換するために共有メモリに割り当てる必要があるか、所有権を取得して特定のアロケータの使用を要求するシステム関数に渡す必要がある場合があります。(これには、すべてのサブオブジェクトに同じメカニズムを実装する必要があることに注意してください。これを実現する一般的な方法はありません)。

同様に(私が使用している場合)、その場でコードを作成する場合です。最近では、このメモリページのデータの実行が許可されていることをOSに通知する必要がありますが、このメモリはかなり大きなチャンク(4Kなど)で取得されます。繰り返しになりますが、実行権限を持つOSからページ(4K)を要求し、その上に多くの小さなオブジェクトを割り当てます-新しい配置を使用します。

于 2009-08-27T06:38:40.520 に答える
1

残念ながら、私の知る限り、標準配置の new 演算子のクラス固有のオーバーロードは実行できません。カスタム配置の new 演算子のみです。= deleteそのため、ユースケースは少しアカデミックですが、C++11を使用してクラスに新しい配置を禁止するために使用したかったのです。これは標準ではうまく機能しますoperator newが、新しい配置には適していません。

于 2015-09-19T11:37:23.790 に答える
0

馬の口wikiからまっすぐ。「使用」というタイトルのセクションは、新しい配置の必要性を強調しています。このSOスレッドはこちらも役立つかもしれません

更新: 質問に具体的に答えるために; <new>クラスのいくつかのオブジェクトを構築するために使用したいメモリのプールがあるが、クラス全体に対して operator new をオーバーロードしたくない場合は、header によって提供される標準配置 newを使用できます。後者の場合、すべてのクラス オブジェクトは、クラスで定義されている新しいオーバーロードされた配置に従って配置されます。

于 2009-08-27T05:59:46.433 に答える
0

プレースメントnewをオーバーロードできるかどうかはわかりませんが、通常の new のみです。唯一可能な実装は一時オブジェクトを作成し、それを指定されたメモリアドレスにmemcp'ingすることだけなので、その用途は1つも考えられません-そこに他のメモリを割り当てることは想定されていないためですが、与えられたものを使用します。

于 2009-09-09T20:32:33.550 に答える