如果我有结构
struct three
{
char a,b,c;
};
我使用编译器编译指示确保sizeof 3为3,如果我有vector<three>
则保证
它不会插入元素之间的差距?
又名
那
vec.data()
看起来不像这样:
abc_abc_abc_abc_abc_(_是空格)
答案 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)
时才会成立。