0
struct bar {
  int32 a;    // 4 bytes
  int32 b;    // 4 bytes
  vector<int> c;      // something like 8 or 16 bytes?
}

sizeof(bar) を実行すると、32 バイトになります。それを小さくする方法はありますか?それに対する潜在的なペナルティはありますか?ベクトルの部分についてはよくわかりません...

4

1 に答える 1

1

の通常の実装でstd::vector<T, A>は、3 つのポインターに加えて、ステートフル アロケーターの場合は、アロケーターを維持するために必要なすべてのポインターを使用します。

  1. ベクターの先頭へのポインター。
  2. ベクターの末尾またはベクター内の要素数へのポインター。
  3. 割り当てられたメモリまたは割り当てられた要素の数の末尾へのポインター。

これを型に入れると、アクセス時間を改善するために 4 ワードにパディングされる可能性があります。このようなベクターをさらに 2 つのデータ メンバーと組み合わせると、自然に 8 ワードを占める型が得られます。そのうちの 3 つは高速アクセスのために型を揃えるためのものです。

ベクターは通常空であり、データを含むことはめったにないため、ベクターを含む s のサイズを本当に気にする場合はstruct、おそらく別のレイアウトでの実装を好むでしょう。ベクターは上記の情報を開始する必要がありますが、割り当てられたバッファでデータを開始します。メモリを割り当てるとき、ベクトルは余分なスペースを割り当てて、管理情報を実際の値の前に追加し、割り当てられたデータへのポインタを格納します (おそらく最初の要素へのポインタですが、管理の回復を行います)。情報は移植できません)。

今説明した表現を使用すると、ベクトルのサイズは 1 ワードになり、全体のサイズはstruct3 ワードとパディング、つまりおそらく 4 ワードになります。begin()ベクトルのサイズまたは容量が必要な場合 (たとえば、および `end()を使用する場合) には、小さいオーバーヘッドと引き換えに、より良いサイズが使用されます。

一般に、ベクトルの実際のメモリ消費量はベクトル内の要素にまで及ぶため、ベクトルのサイズは問題にならない傾向があります。

于 2012-11-10T19:20:15.147 に答える