我可以确定向量包含对象而不是指向对象的指针吗?

Can I be sure a vector contains objects and not pointers to objects?

我可以确定 std::vector(或者,一般来说,任何标准容器)包含对象而不是指向对象的指针,无论对象的 class 有多复杂,如果它有恒定大小?

例如:在这个简单的例子中:

struct MyStruct { int a, b; };
std::vector<MyStruct> vs;

生成的矢量布局为:

[ ..., a1, b1, a2, b2, a3, b3, ... ]

标准是否保证在这种(或更复杂的)情况下会发生同样的情况,其中结构的大小应该是常数:

struct MyStruct2 { float f[10]; };
std::vector<MyStruct2> vs2;

布局:

[ ..., f1[0], f1[1], ..., f1[9], f2[0], f2[1], ..., f2[9], ... ]

而不是:

[ ..., *pf1, *pf2, ... ]
pf1 = [ f1[0], f1[1], ..., f1[9] ]
pf2 = [ f2[0], f2[1], ..., f2[9] ]

自 C++11 及以后版本(C++03 几乎 保证),std::vector 中的数据是连续的,没有间隙。

特别是如果您有一个指向 std::vector 中的元素的指针,您可以使用指针算法访问所有其他元素。

当然,指针运算以 sizeof 为单位 structstruct 本身可能包含填充。给定指向结构中 a 的指针,尝试到达 b 的行为未定义。