次のメモリ使用量の違いは何ですか:
std::vector<X*> vec
各要素はヒープ上にありますが、ベクトル自体はそうではありません
と
std::vector<X>* vec
ベクトルはヒープ上で宣言されていますが、各要素は (スタック上?) にあります。
2 番目のオプションはあまり意味がありません。ベクトル ポインターがヒープ上にあることを意味しますが、スタック上にある各要素を指すのでしょうか??
次のメモリ使用量の違いは何ですか:
std::vector<X*> vec
各要素はヒープ上にありますが、ベクトル自体はそうではありません
と
std::vector<X>* vec
ベクトルはヒープ上で宣言されていますが、各要素は (スタック上?) にあります。
2 番目のオプションはあまり意味がありません。ベクトル ポインターがヒープ上にあることを意味しますが、スタック上にある各要素を指すのでしょうか??
これがあなたが本当に尋ねたものである場合:
vector<X>* vec = new vector<X>();
これは、すべての要素を含むベクトル全体がヒープ上にあることを意味します。要素は、ヒープ上の連続したメモリ ブロックを占有します。
優れた最新の C++ スタイルを使用するコードでは、上記のいずれも当てはまりません。
std::vector<X*>
X
所有していないタイプまたはそのサブクラスのオブジェクトへのハンドルのコレクションです。所有者は、それらがどのように割り当てられたかを知っており、割り当てを解除します - あなたは知りませんし、気にしません。
std::vector<X>*
実際には、所有していない(呼び出し元が所有している)が変更しようとしているベクトルを表す関数引数としてのみ使用されます。一般的なアプローチの 1 つによれば、ベクトルではなくポインターであるということは、オプションであることを意味します。ごくまれに、アタッチされたベクトルの有効期間が、それを指すクラスよりも長生きすることがわかっているクラス メンバーとして使用されることがあります。
std::vector<std::unique_ptr<X>>
のさまざまなサブクラスの混合オブジェクトのポリモーフィックなコレクションですX
(おそらくX
それ自体も直接)。移動にコストがかかる場合は非ポリモーフィックに使用することもありますがX
、最新のスタイルではほとんどの型を安価に移動できます。
C++11 より前では、std::vector<some_smart_pointer<X> >
(はい、閉じ括弧の間にスペースがあります) は、ポリモーフィック ケースとコピー不可ケースの両方に使用されていました。コレクションで使用でき なかった not 、まだ存在していなかったsome_smart_pointer
notに注意してください。良い選択でした。C++11 では、コレクション要素のコピー可能性要件が移動可能性に緩和されたため、この理由は完全になくなりました。(ScopeGuard パターンなど、コピーも移動もできないタイプがいくつか残っていますが、これらはいずれにせよコレクションに格納するべきではありません)std::unique_ptr
std::auto_ptr
boost::unique_ptr