2017-02-18 4 views
1

私にstd::vector<std::set<int>>がある場合。容量を超えて挿入すると、ベクトルは再割り当てされます。ベクトル内に別のサイズ変更可能な型がある場合は、ベクトルはその型へのポインタのみを保持していますか?C++コンテナを含むコンテナの成長?

特に、ベクトルが任意の型を保持している場合のメモリの割り当て方法について知りたいと思います。

std::vector<int> a(10); //Size will be sizeof(int) * 10 
std::vector<std::set<int>> b(10); 
b[0] = {0, 0, 0, 0, 0, 0, 0, .... }; //Is b's size effected by the sets inside? 
+0

'std :: set'は動かすことができますか、何について質問していますか? –

+1

あなたは用語を混ぜています。ベクトルのサイズは、それが保持する要素の数です。あなたの例では、 'b'のサイズは10であり、変更されません。 – user463035818

+0

必ずしもstd :: setとは限りません。ベクトル、ベクトルがあり、含まれている型のサイズが変わった場合、メインベクトルは大きくなりますか?どうしたらそれがわからないのですか?コンパイラはどのように決定しますか? –

答えて

2

ベクトルが "それ自身で"割り当てるメモリは常にsizeof(element_type)* vector.size()になります。

ベクトルは、コンパイル時に表示される要素データにのみメモリを割り当てます。。要素クラスによって行われた割り当てについては気にしません。

ベクターをステロイドのアレイと考えてください。配列と同様に、ベクトルはすべての要素が同じサイズの連続したメモリブロックで構成されます。この要件を満たすには、コンパイル時に各要素の大きさを知る必要があります。

のstd ::これらのメンバ変数を持つように設定を想像:

struct SomeSet 
{ 
    size_t size; 
    SomeMagicInternalType* data; 
}; 

のでdataが実行でが割り当てられますどんなには、ベクトルのみそれがコンパイル時に知っている何のために要素ごとにメモリを割り当て時間:32ビットマシン上で4 + 4になり

はsizeof(SomeSet ::サイズ)+はsizeof(SomeSet ::データ)

+0

私は、私が大きくなることを心配している部分がヒープにあることを知っています。 –

0

std::vector<T>はタイプTのオブジェクトを保持しています。サイズが変更されると、必要に応じてそれらのオブジェクトをコピーまたは移動します。 Aも同じです。タイプstd::set<int>のオブジェクトを保持します。

3

C++オブジェクトは1つのサイズしか持つことができませんが、任意のサイズのヒープメモリへのポインタを含めることができます。ですから、コンテナオブジェクト自体には一般にヒープメモリへのポインタが含まれており、おそらく実際のアイテムは含まれていない可能性があります。 (唯一の一般的な例外は、時々、文字列オブジェクトはヒープメモリを割り当てずに、オブジェクトに直接小さな文字列を含むことを可能にする「小さな文字列の最適化」を有する、文字列型である。)

1

この例を考えてみます。

#include <iostream> 
#include <vector> 

int main() {  
    std::vector<int> v; 
    std::cout << sizeof(v) << "\n"; 
    std::cout << v.size() << "\n"; 

    v.push_back(3); 
    std::cout << sizeof(v) << "\n"; 
    std::cout << v.size() << "\n";  
} 

正確な数は異なる場合がありますが、私は出力として取得する:あなたが要素を追加するときvector

24 
0 
24 
1 

サイズ(サイズ=オブジェクトの大きさ)は変更されません。 setの場合も同様です。したがって、要素の1つが要素を追加または削除する場合、vector<set>は再割り当てする必要はありません。

セットはその要素をメンバーとして格納しません。そうでない場合、要素の数が異なるセットは異なるタイプになります。それらはヒープに格納されており、そのままsetのサイズには寄与しません。

関連する問題