【发布时间】:2017-08-08 18:47:35
【问题描述】:
类模板std::variant 代表一个类型安全的联合。在任何给定时间,std::variant 的实例要么持有其替代类型之一的值,要么不持有任何值。
sizeof(std::variant<float, int32_t, double>) == 16
但如果是联合,为什么要占用这么多空间呢?
struct T1 {
float a;
int32_t b;
double c;
};
struct T2 {
union {
float a;
int32_t b;
double c;
};
};
变体与结构体大小相同
sizeof(T1) == 16
sizeof(T2) == 8
我希望联合的大小,加上要存储的 4 个字节,哪种类型是活动的。
【问题讨论】:
-
您使用的是 32 位系统还是 64 位系统?您使用的是哪个编译器/标准库?
-
32 位,以及带有
/std:c++latest选项的 Visual Studio -
即使是这样,如果这是标准布局,它也需要 16 个字节。因为你的结构中最大的单词是 8 个字节,在你的情况下,4 个字节将被填充到 8。删除双精度,它的大小将是 8。
-
巧合。添加更多成员。