4

これはおそらくC++初心者には明らかですが、少し困惑しています-クラスの文字列メンバーはそのクラスに可変量のスペースを割り当てますか? それとも、メモリ内の他のスペースにポインタを内部的に割り当てるだけですか? たとえば、この例では:

class Parent {
    public:
    vector<Child> Children;
}

class Child {
    public:
    string Name;
}

「new Parent()」を作成し、さまざまな長さの文字列を持ついくつかの子を追加すると、ヒープにどのように割り当てられますか? 親は 4 バイト、子は 4 バイト (または任意のポインター サイズと固定サイズの内部データ)、そしてヒープ上の別の場所にあるランダムな文字列の山ですか? それとも、すべてがメモリにまとめられていますか?

一般的に、コンテナー型は常に固定サイズであり、可変サイズのデータ​​へのポインターのみを含み、そのデータは常にヒープ上にあると思いますか?

4

4 に答える 4

7

C++のクラスは常に固定サイズです。ベクトルの要素や文字列内の文字など、可変サイズのコンポーネントがある場合、それらはヒープに割り当てられます(小さな文字列の場合は、文字列自体に埋め込まれることもあります。これは、小さな文字列と呼ばれます。最適化)。つまり、オブジェクトには、オブジェクトがヒープ上に割り当てられている場所Parentが含まれます(オブジェクト自体は、おそらくデータに3語を保持しますが、レイアウトにはいくつかの方法があります)。のオブジェクトは、独自のメモリを割り当てます。つまり、かなりの数のメモリ割り当てがある可能性があります。std::vector<Child>Childstd::vector<...>std::stringChild

C ++ 2011標準は、オブジェクトとそのすべての子への割り当てメカニズムの受け渡しをサポートするアロケータを完全に定義しています。もちろん、クラスもこのメカニズムをサポートする必要があります。ParentChildクラスにアロケータを使用する適切なコンストラクタがあり、このアロケータを割り当てを行うすべてのメンバーに渡す場合、システム全体に伝播されます。このように、一緒に属するオブジェクトの割り当ては、適度に近接するように配置できます。

于 2013-01-03T23:11:14.590 に答える
3

C ++のクラスは、常に固定サイズです。したがってvectorstringヒープに割り当てられたメモリ*へのポインタのみを含めることができます(ただし、長さも格納する必要があるため、通常は1つのポインタよりも多くのデータが含まれます)。したがって、オブジェクト自体は常に固定長になります。

*stringこれは完全に正しいわけではありません。多くの場合、短い文字列の最適化と呼ばれる最適化手法が使用されます。その場合、小さな文字列がオブジェクト内(ヒープデータへのポインタが格納される場所)に埋め込まれ、文字列が長すぎる場合にのみヒープメモリが割り当てられます。

于 2013-01-03T23:11:45.030 に答える
1

はい-あなたの言葉を使用して-コンテナタイプは常にそれ自体が固定サイズであり、可変サイズのデータ​​へのポインタを含むだけです。

がある場合vector<int> vi;、のサイズは、の数に関係なく、正確にviは常に固定されます。sizeof(vector<int>)intvi

于 2013-01-03T23:10:46.280 に答える
0

クラスの文字列メンバーは、そのクラスに可変量のスペースを割り当てますか?

いいえ、違います。

それとも、メモリ内の他のスペースにポインタを内部的に割り当てるだけですか?

いいえ、違います。

std::string割り当てはsizeof(std::string)あります。

混同しないでください

  1. オブジェクトのサイズ
  2. オブジェクトが担当するリソースのサイズ。
于 2013-01-03T23:10:27.433 に答える