c++ - 为什么 sizeof(std::variant) 与具有相同成员的结构的大小相同?

标签 c++ unions c++17

类模板 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 的倍数,确保数组中每个 variantdouble 都按 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/

相关文章:

c++ - C++程序中的虚拟内存大小增加

c++ - std::vector 成员的移动语义

c++ - 双重简单的 for 循环与一个复杂的循环

C++ union 、结构、成员类型

C++ 对列表和单个对象的迭代

c - (标记)联盟中的活跃成员

C union 并同时分配给成员

c++ - 在函数范围外的 header 中使用 UDL

c++ - 有没有办法获取容器模板类型以将其与另一个 value_type 重用?

c++ - constexpr if 和 static_assert