std::vector of structs:结构体的成员如何保存在内存中

ATK*_*ATK 1 c++ pointers

我有以下课程:

struct xyzid{
  uint16_t i;
  uint16_t z,y,x;
};
      
std::vector<xyzid> example;

(...) // fill example

uint16_t* data = reinterpret_cast<uint16_t*>(example.data());
Run Code Online (Sandbox Code Playgroud)

我现在可以确定我的指针基本上是这样的:前 16 位在移动到下一个元素之前先data引用i、然后zy、吗?x或者,是否不能保证我的结构中的声明顺序保留在我的std::vector容器中?

Rem*_*eau 6

包含vector已分配的结构数组。指针data指向数组中的第一个结构体。数组中的结构体按顺序存储在内存中。每个结构体的字段也按照声明的顺序顺序存储在内存中。所以是的,该数组将由第一个 struct fields i、 then z、 then yxthen 、第二个 struct fields 组成,依此类推。

但是,您不能指望第一个结构体的z字段将占用内存的第二个 16 位,或者该y字段将占用内存的第三个 16 位,等等。这取决于结构体的对齐填充。如果您希望以这种方式填充内存,则保证这一点的唯一方法是禁用结构及其字段之间的所有对齐填充,方法是将结构的对齐声明为 8 位/1 字节,例如使用#pragma pack(1)__attribute(packed)或其他类似的编译器指令。

但是,如果可以的话,你真的不应该依赖这种行为。如果您绝对需要内存具有精确的布局,请改用序列化