将vector作为成员对齐的结构(c ++)

时间:2012-11-10 18:08:14

标签: c++ vector sizeof

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

当我做sizeof(bar)时,它会给出32个字节! 我能以任何方式对齐它变得更小吗?任何潜力 罚款?我不太确定矢量部分......

1 个答案:

答案 0 :(得分:1)

std::vector<T, A>的正常实现是指针有三个指针加上有状态分配器,无论维护分配器需要什么:

  1. 指向矢量开头的指针。
  2. 指向矢量末尾或矢量中元素数量的指针。
  3. 指向已分配内存的结尾或已分配元素数的指针。
  4. 将此类型放入类型时,可能会将其填充为4个字以改善访问时间。当你将这样的矢量与另外两个数据成员组合在一起时,你自然会得到一个占用8个单词的类型,其中三个是对齐类型以便快速访问。

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

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

    通常,向量的大小往往不重要,因为向量的实际内存消耗低于向量中的元素。