繁体   English   中英

对齐以vector为成员的结构(C ++)

[英]align struct having vector as a member (c++)

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

当我执行sizeof(bar)时,它会提供32个字节! 无论如何,我会对准它是更小的东西? 有任何潜在的惩罚吗? 我不太确定矢量部分...

std::vector<T, A>的常规实现是有一个指针,该指针要有三个指针,对于有状态分配器,无论维护分配器需要花费什么:

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

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

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM