1

如果我有结构

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

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

abc_abc_abc_abc_abc_ (_ 是空格)

4

3 回答 3

3

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

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

于 2013-10-15T08:47:16.627 回答
3

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

但是,该数组布局将取决于您的实现选择如何对齐和填充此结构;您可以通过查看sizeof(three).

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

于 2013-10-15T08:48:48.407 回答
1

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

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

于 2013-10-15T09:07:46.247 回答