c++ - 内存顺序中的 std::array 和 std::tuple
问题描述
我正在测试一个小代码片段,我很惊讶与放入 std::array 和 std::tuple 的 4 个字节的相同表示产生不同的内存布局
#include <iostream>
#include <tuple>
#include <array>
struct XYZW {
uint32_t x;
uint32_t y;
//std::array<uint8_t,4> z;
std::tuple<uint8_t, uint8_t, uint8_t, uint8_t> z;
uint32_t w;
};
int main() {
XYZW i;
i.z = {255, 0, 0, 0};
uint32_t z = (*reinterpret_cast<uint32_t*>(&i.z));
std::cout << z << " \n";
}
对于元组,输出是:4278190080
,而对于数组,它是:255
。这是预期的吗?
解决方案
std::array
具有标准指定的布局,但std::tuple
没有,并且可以是实现所需的任何布局。
所以预计它们可能会有所不同,但当然它们也可能碰巧在某些编译器/版本/平台上选择相同的布局 - 只是不能保证。
实际上,最简单的实现方法之一std::tuple
是递归,因为它最初是在 Loki 库中完成的。这将以相反的顺序排列字段(最基类,其子对象在前,是类型列表最后一个成员的叶子)。不过,这不是唯一可能的实现,而且我观察到编译器/标准库实现之间的字段顺序不同。
注意。正如评论中提到的,您当前的诊断有 UB - 但是,您可以reinterpret_cast<char*>(&i.z)
安全地十六进制转储 4 个字节并获得等效结果。
推荐阅读
- opendaylight - 使用 Opendaylight 的链路聚合控制协议
- spring - 涡轮机不适用于 spring boot 2.0.6 和 spring cloud Finchley.SR1
- pdf - 创建附加在一起的所有条形图的 pdf
- sql-server - 将实例分配给滚动但重置 10 秒的时间间隔
- android - Android Emulator:设置代理服务器时如何不代理 10.0.2.2?
- java - 不能在内部类中使用变量
- javascript - 如何通过表单输入提交带有子文件夹的文件夹?
- routing - Polymer SPA 的登录页面
- spring - Keycloak Grails Spring - 登录后重定向
- c++ - 在 g++ v8.2.0 中使用 std::experimental::optional