2009-08-27 10 views
1

グローバルクラスを置き換えることができない場合でも、クラス固有のバージョンのプレースメントが提供されます。クラスで独自のプレースメントnew演算子を提供する必要があるシナリオは何ですか?クラス固有のバージョンのプレースメントの新機能は何ですか?

私のクラスがプレースメントnewを実装しない場合でも、次のコードが機能します(abcオペレータnewがオーバーロードされていないと仮定します)。

char arr[100]; 

abc *pt = new(&arr)abc; 

ので、私はいくつかのデフォルトの配置が新しいあり、解釈が、クラスのために、我々はnew演算子の私たち自身のバージョンを提供することができ、私の質問は、そのためのユースケースは何ですか? 他に何をして、同じポインタを返すのでしょうか?あなたが遭遇した有用な例/シナリオはありますか?

答えて

0

馬の口からストレートwiki。 「使用」というタイトルのセクションでは、新しいプレースメントの必要性が強調されています。 このSO hereも役立つかもしれないスレッド

UPDATE: は、特にあなたが質問に答えるために。クラスのいくつかのオブジェクトを構築するために使用したいメモリのプールがあるが、オペレータnewをクラス全体に対して過負荷にしたくない場合は、ヘッダ<new>によって提供される新しい標準配置を使用することができます。このクラスで定義されている後者のケースでは、すべてのクラスオブジェクトが

+0

アブヘイ、新しい配置の必要性について議論する用意スレッドは、私の質問はありますか? – Learner

+0

@learner:新しいデフォルトのプレースメントのようなものはありません。プログラマは1つを提供しなければならず、その理由がそこに記述されています。これは通常クラス固有の基準で行われるということは、コピーセマンティクスに注意する必要がある設計上の問題です(C++コーディング標準 - Item 45、By Sutter and Alexandrescu)。 – Abhay

+0

@Abhay:次のコードは、私のクラスは、[100]配置新しい char型の編曲を実装scroll down toパソコンへ転送しても動作します。 abc * pt = new(&arr)abc; 私は解釈すると、いくつかのデフォルト配置が新しいのでしょうか? クラスでは独自のバージョンを提供できますが、私の質問はそのためのユースケースですか?何が他のことをやろうとしていて、渡された同じポインタを返しますか?あなたが遭遇した有用な例/シナリオはありますか? – Learner

1

は、クイズの質問のように聞こえる新しいオーバーロードされた配置に従って配置されている...最も一般的な理由がある

より速く、より希薄な配分
動的に割り当てられる必要がある多数の小さなオブジェクト。固定サイズオブジェクト用のカスタムアロケータは、汎用アロケータよりもはるかに少ない割り当てオーバーヘッドを持ち、フラグメンテーションに悩まされず、通常は高速です。 (また、これらの割り当てがメインヒープから削除されても、メインヒープフラグメンテーションにはそれ以上貢献しません)。

と同様に、フリーではないアロケータ(複数のオブジェクトを割り当てることができますが、それらをまとめて解放することはできません)は、可能な限り速い割り当て方式であり、オーバーヘッドはありませんまれなケース)。変更しないデータ構造を構築していて、全体を削除するだけの方が理にかなっています。

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

私が使っているところは、コードをオンザフライで作成することです。今日では、このメモリページのデータは実行できるようにOSに指示する必要がありますが、このメモリはかなり大きなチャンク(たとえば4K)になります。もう一度、実行権を持つOSからページ(4K)を要求し、その上に多数の小さなオブジェクトを配置します。新しい配置を使用します。

+1

@peterchen:以前は、新しいプレースメントの使用に似ていると思っていました。 :-) – Learner

0

プレースメントが新しく追加されました。あなたがそこに他のメモリを割り当てることになっていないため、しかし - 私は唯一の可能な実装は、単に一時オブジェクトを作成し、特定のメモリアドレスにmemcp'ingされているので、そのためにも、一回の使用を考えることはできません指定されたものを使用してください。

1

残念ながら、私の知る限り、あなただけのカスタム配置新しい演算子で、標準配置new演算子のクラス固有のオーバーロードを行うことはできません。そのため、ユースケースは少し学術的ですが、C++ 11の= deleteを使用してクラスの新しい配置を禁止するために使用したかったのです。これは標準のoperator newでは有効ですが、新しいプレースメントでは機能しません。 1はデフォルトのものを使用するのではなく、彼自身の実装を提供する理由

関連する問題