std :: vector是否保证不会在元素之间留下空隙?

时间:2013-10-15 08:46:06

标签: c++ stl alignment

如果我有结构

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

我使用编译器编译指示确保sizeof 3为3,如果我有vector<three>则保证 它不会插入元素之间的差距? 又名 那 vec.data()看起来不像这样:

  

abc_abc_abc_abc_abc_(_是空格)

3 个答案:

答案 0 :(得分:3)

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

但是,您可以检查sizeof(three),以确定布局是否符合您的要求。数组(和vector中的元素)没有外部空位,所以如果该值为3,那么你就可以了。

答案 1 :(得分:3)

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

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

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

答案 2 :(得分:1)

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

由于&vec[0]的类型为T*,因此仅当连续元素之间的字节差等于sizeof(T)时才会成立。