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



如果我有结构体

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

我使用编译器编译指示来确保 3 的大小为 3,如果我有vector<three>它不会在元素之间插入间隙?即那 vec.data()不会看起来像这样:

abc_abc_abc_abc_abc_(_ 为空白区域)

不,语言标准不能保证这种内容,并且编译指示依赖于编译器。检查编译器手册是否提供任何保证。

但是,您可以检查sizeof(three)以确定布局是否符合您的要求。数组(和vector中的元素)没有外部间隙,所以如果该值为 3,则没问题。

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

但是,该数组布局将取决于您的实现如何选择对齐和填充此结构;您可以通过查看sizeof(three)来获得它如何做到这一点的提示。

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

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

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

最新更新