结构体成员在std::vector中的内存存储顺序是否有保障?
问题解答:结构体成员顺序在std::vector内存中的确定性
首先看你的代码实现:
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());
可以确保指针data指向的内存中,首个16位对应成员i,随后依次是z、y、x,之后是vector下一个元素的i、z、y、x。
原因如下:
- C++标准明确规定,结构体的非静态成员会按声明顺序在内存中依次布局。你这里所有成员都是同类型的
uint16_t,对齐要求完全一致,编译器不会插入额外的填充字节打乱顺序,所以单个xyzid对象的内存布局就是i→z→y→x。 std::vector的底层内存是连续的,容器中的每个xyzid对象会按顺序连续存储,每个对象的内部布局严格遵循结构体的成员声明顺序。- 通过
reinterpret_cast将xyzid*转换为uint16_t*后,遍历该指针会按内存的连续顺序访问每个16位数据,完全匹配结构体成员的声明顺序,以及vector中元素的存储顺序。
内容的提问来源于stack exchange,提问作者ATK
相关产品推荐
相关产品推荐

