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>是拥有一个具有三个指针的指针,对于有状态的分配器,无论维护分配器需要什么:

  1. 指向向量开始的指针。
  2. 指向向量末尾的指针或向量中的元素数。
  3. 指向已分配内存末尾或已分配元素数的指针。

将其放入类型时,可能会填充为 4 个单词以缩短访问时间。当你将这样的向量与另外两个数据成员组合在一起时,你自然会得到一个占用 8 个字的类型,其中三个用于对齐类型以便快速访问。

如果您真的关心struct包含向量的 s 的大小,因为该向量通常是空的并且很少包含数据,那么您可能更喜欢具有不同布局的实现:该向量仍然需要启动上述信息,但它可以从分配的缓冲区开始数据:分配内存时,向量将分配额外的空间以将其管理信息添加到实际值并存储指向已分配数据的指针(可能指向第一个元素,但是,这会恢复管理信息不可移植)。

使用刚刚描述的表示,向量的大小将是一个单词,而您的总大小struct将是三个单词加上填充,即可能是 4 个单词。begin()当需要向量的大小或容量时(例如,使用and `end() 时),以较小的开销换取更好的大小。

通常,向量的大小往往无关紧要,因为向量的实际内存消耗取决于向量中的元素。

于 2012-11-10T19:20:15.147 回答