std::array与std::tuple存储相同4字节时内存布局不同是否符合预期?
该现象完全符合C++标准的预期
- 关于std::array的布局:C++标准明确要求
std::array是封装原生数组的聚合类型,内存布局连续紧凑,元素存储顺序与声明顺序完全一致,且不存在额外填充。你存入的4个字节顺序为[255, 0, 0, 0],在常见的小端架构CPU上,直接将首地址重解释为uint32_t读取得到的数值就是0x000000FF即255,和你的测试结果一致。 - 关于std::tuple的布局:C标准从未对
std::tuple的内部内存布局做任何强制规定,仅要求get<N>(tuple)可以返回对应索引位置的元素。主流标准库(如GNU的libstdc)的tuple普遍采用递归继承的方式实现,元素存储顺序往往和模板参数声明顺序相反,你测试时存入的[255, 0, 0, 0]在内存中实际排列为[0, 0, 0, 255],小端架构下读取为0xFF000000即4278190080,和你的测试结果吻合。 - 额外注意:你测试代码中使用
reinterpret_cast直接重解释非标准布局类型(std::tuple)的内存属于未定义行为,该写法不具备可移植性,即使在当前环境下跑出预期结果也不能在生产代码中使用。
内容的提问来源于stack exchange,提问作者lhog
相关产品推荐
相关产品推荐

