我有以下课程:
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、然后z、y、吗?x或者,是否不能保证我的结构中的声明顺序保留在我的std::vector容器中?
包含vector已分配的结构数组。指针data指向数组中的第一个结构体。数组中的结构体按顺序存储在内存中。每个结构体的字段也按照声明的顺序顺序存储在内存中。所以是的,该数组将由第一个 struct fields i、 then z、 then y、xthen 、第二个 struct fields 组成,依此类推。
但是,您不能指望第一个结构体的z字段将占用内存的第二个 16 位,或者该y字段将占用内存的第三个 16 位,等等。这取决于结构体的对齐填充。如果您希望以这种方式填充内存,则保证这一点的唯一方法是禁用结构及其字段之间的所有对齐填充,方法是将结构的对齐声明为 8 位/1 字节,例如使用#pragma pack(1)或__attribute(packed)或其他类似的编译器指令。
但是,如果可以的话,你真的不应该依赖这种行为。如果您绝对需要内存具有精确的布局,请改用序列化。
| 归档时间: |
|
| 查看次数: |
158 次 |
| 最近记录: |