【问题标题】:Is std::vector guaranteed not to leave gaps between elements?std::vector 是否保证不会在元素之间留下间隙?
【发布时间】:2013-10-22 23:56:30
【问题描述】:

如果我有结构

struct three
{
   char  a,b,c;
};

并且我使用编译器编译指示来确保 sizeof 3 为 3 是否可以保证如果我有 vector<three> 它不会在元素之间插入间隙? 又名 那 vec.data() 不会是这样的:

abc_abc_abc_abc_abc_ (_ 是空格)

【问题讨论】:

  • 不保证,存在无法访问未正确对齐的对象的硬件

标签: c++ stl alignment


【解决方案1】:

不,语言标准不能保证这种情况,并且编译指示依赖于编译器。检查您的编译器手册,编译器是否做出任何保证。

不过,您可以检查sizeof(three),以确定布局是否符合您的要求。数组(以及vector 中的元素)没有外部间隙,因此如果该值为 3,则很好。

【讨论】:

  • @NoSenseEtAl:是的,数组的布局没有元素之间的间隙,每个元素占用sizeof(T)字节。唯一的数据间隙可能来自结构末尾的内部填充,您可以从更大的尺寸中看出这一点。
【解决方案2】:

它的布局方式与结构数组的布局方式相同。

然而,该数组布局将取决于您的实现选择如何对齐和填充此结构;您可以通过查看 sizeof(three) 来了解它是如何做到的。

一些编译器允许您使用 pragma 或属性更改对齐和填充,但这很少是一个好主意,因为编译器制造商通常会尝试使用最佳对齐(基于速度和内存开销)

【讨论】:

    【解决方案3】:

    这是由“连续存储”条件保证的。它在 C++03 中被添加到标准中,尽管在此之前它已经在实现中很常见。它的意思是0 <= n < vec.size()&vec[n] == &vec[0] + n

    由于&vec[0] 具有T* 类型,这仅在连续元素之间的字节差等于sizeof(T) 时成立。

    【讨论】:

      猜你喜欢
      • 2010-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-01-28
      • 2017-10-15
      • 2017-05-27
      • 1970-01-01
      相关资源
      最近更新 更多