类模板 std::variant
表示类型安全的 union 。 std::variant
的实例在任何给定时间要么持有其替代类型之一的值,要么不持有任何值。
sizeof(std::variant<float, int32_t, double>) == 16
但是如果是union,为什么要占用这么多空间呢?
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
我希望 union 的大小加上要存储的 4 个字节,哪种类型是事件的。
最佳答案
这里variant
中对齐最大的类型是double
,对齐为8。这意味着整个variant
必须有8 对齐。这也意味着它的大小必须是 8 的倍数,确保数组中每个 variant
的 double
都按 8 对齐。
但是变体必须存储的不仅仅是最大的类型:它还必须存储标识符或标记以了解当前实例化的类型。因此,即使该标识符仅使用 1 个字节,整个结构也会被填充为 16,因此它的大小是 8 的倍数。
更正确的比较应该是:
struct
{
union
{
float a;
int32_t b;
double c;
};
int identifier;
};
关于c++ - 为什么 sizeof(std::variant) 与具有相同成员的结构的大小相同?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45575892/