如果我有结构
struct three
{
char a,b,c;
};
我使用编译器编译指示来确保 sizeof 3 是 3 是否保证如果我有vector<three>
它不会在元素之间插入间隙?也
vec.data()
不会是这样的:
abc_abc_abc_abc_abc_ (_ 是空格)
不,语言标准无法保证这种情况,并且编译指示依赖于编译器。检查您的编译器手册,编译器是否做出任何保证。
不过,您可以检查sizeof(three)
以确定布局是否符合您的要求。数组(和 a 中的元素vector
)没有外部间隙,因此如果该值为 3,则没问题。
它将以与结构数组相同的方式布局。
但是,该数组布局将取决于您的实现选择如何对齐和填充此结构;您可以通过查看sizeof(three)
.
一些编译器允许您使用编译指示或属性更改对齐和填充,但这很少是一个好主意,因为编译器制造商通常会尝试使用最佳对齐(基于速度和内存开销)
这是由“连续存储”条件保证的。它被添加到 C++03 的标准中,尽管在此之前它已经在实现中很常见。它说的大意是 for 0 <= n < vec.size()
, &vec[n] == &vec[0] + n
.
由于&vec[0]
has 类型T*
,这仅在连续元素之间的字节差等于 时才成立sizeof(T)
。