5

この質問に対する正確な答えが見つからなかったため、ここに投稿しました。ベクトルについて考えるとき、連続したメモリ位置にオブジェクトを構築する必要があります。これは、ベクトルが割り当てられたメモリを保持し、それにプッシュされるオブジェクトのインプレース構築 (=placement new) を行う必要があることを意味します。これは有効な仮定ですか?また、これはコンテナーが delete を呼び出すのではなく、手動でデストラクタを呼び出しているということですか? ここで見逃している他の仮定はありますか? これは、私が書くことを選択した場合、オブジェクトのカスタム作成された新しいものでさえ呼び出されない可能性があると想定できることを意味しますか?

また、継続的なメモリ保証が必要ないため、リストで new と delete を使用することも理にかなっています。では、この種の動作は、アロケータの動作を駆動するものですか? 助けてください。ありがとう

4

2 に答える 2

4

これは、ベクトルが割り当てられたメモリを保持し、それにプッシュされるオブジェクトのインプレース構築 (=placement new) を行う必要があることを意味します。これは有効な仮定ですか?

はい

また、これはコンテナーが delete を呼び出すのではなく、手動でデストラクタを呼び出しているということですか?

はい

ここで見逃している他の仮定はありますか? これは、私が書くことを選択した場合、オブジェクトのカスタム作成された新しいものでさえ呼び出されない可能性があると想定できることを意味しますか?

はい。リンクされたリストであっても、コンテナーは型のインスタンスを割り当てず、型のサブオブジェクトを含むテンプレート化された構造を割り当てることを考慮してください。少なくとも 2 つのポインター (両方のリンク) とその型のサブオブジェクトを含む複合型になるリンク リストの場合。割り当てられる実際のタイプは、あなたのタイプではなく、そのnodeです。

また、継続的なメモリ保証が必要ないため、リストで new と delete を使用することも理にかなっています。

それはしますが、そうではありませんnew/deleteあなたのタイプのオブジェクト。

では、この種の動作は、アロケータの動作を駆動するものですか?

質問のこの部分がよくわかりません。アロケーターは、標準で定義された一連の制約を持つクラスであり、インターフェイス ( allocatedeallocate...) とセマンティクス (の意味は==、一方に割り当てられたメモリを他方で割り当て解除できるということです。クラス内の他の状態は関係ありません)。

mallocアロケーターは、効率など、さまざまな理由で作成してコンテナーに渡すことができます (オブジェクトの型のみを割り当てる場合は、状況に応じて、より効率的な小さなブロック アロケーターを実装できる場合もあります)。

配置に関する補足事項 new

私はいつも興味深いことに、placement newは 2 つの異なる意味を持つように思われる用語です。一方では、オブジェクトをその場で構築する唯一の方法です。しかし、それはまったく別の意味も持っているようです:カスタムアロケータからメモリを取得するこのオブジェクトを構築します

実際、配置 newには、 in-place の構築とは関係のない単一の意味があります。1 つ目は、18.4.1.3 で定義されているようにアロケータが実装 (コンパイラ) によって提供され、オーバーロードできない場合の 2 つ目のケースです。void*オーバーロードされたアロケーターの特定のバージョンは、引数 ( ) を返すだけで、 new-expressionがそれをコンストラクターに渡し、呼び出された新しいバージョンの配置によって割り当てられた (ない) メモリ上にオブジェクトを構築できるようにするだけです。

于 2011-03-14T21:26:11.030 に答える
3

あなたは完全に正しいことに非常に近づいています。vector(および他のすべての標準コンテナー) が割り当てを行う方法は、特定の場所でのオブジェクトの構築と破棄をサポートするクラスを使用することですstd::allocator。内部的には、これは新しい配置と明示的なデストラクタ呼び出しを使用して、オブジェクトを設定および破棄します。

私が「ほぼ完全に正しい」と言う理由は、デフォルトの代わりに新しいアロケータをテンプレート引数として提供することで、STL コンテナがメモリを取得する方法をカスタマイズできるからです。これは、理論的には、STL コンテナがさまざまな方法でオブジェクトを構築および破棄できるようにすることが可能であることを意味しますが、デフォルトでは、標準の配置 new が使用されます。

于 2011-03-14T20:30:07.670 に答える