我可以确定向量包含对象而不是指向对象的指针吗?
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
为单位 struct
。 struct
本身可能包含填充。给定指向结构中 a
的指针,尝试到达 b
的行为未定义。
我可以确定 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
为单位 struct
。 struct
本身可能包含填充。给定指向结构中 a
的指针,尝试到达 b
的行为未定义。