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

Pie*_*tro 2 c++ containers pointers stdvector

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

例如:在这个简单的情况下:

struct MyStruct { int a, b; };
std::vector<MyStruct> vs;
Run Code Online (Sandbox Code Playgroud)

结果向量布局是:

[ ..., a1, b1, a2, b2, a3, b3, ... ]
Run Code Online (Sandbox Code Playgroud)

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

struct MyStruct2 { float f[10]; };
std::vector<MyStruct2> vs2;
Run Code Online (Sandbox Code Playgroud)

带布局:

[ ..., f1[0], f1[1], ..., f1[9], f2[0], f2[1], ..., f2[9], ... ]
Run Code Online (Sandbox Code Playgroud)

代替:

[ ..., *pf1, *pf2, ... ]
pf1 = [ f1[0], f1[1], ..., f1[9] ]
pf2 = [ f2[0], f2[1], ..., f2[9] ]
Run Code Online (Sandbox Code Playgroud)

Bat*_*eba 8

从 C++11 开始(C++03几乎保证了这一点),a 中的数据std::vector是连续的,没有间隙。

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

当然,指针算术sizeofstruct. 并且其struct本身可能包含填充。给定结构中b指向 an 的指针,尝试访问 a 的行为是未定义的。a

  • 臭名昭著的异常 `std::vector&lt;bool&gt;` (3认同)