11

大家好,
我想知道union是否使用了padding?
由于 union 的大小是最大的数据成员大小,最后可以有填充吗?

4

2 回答 2

16

因为联合的大小是最大的数据成员大小

这不一定是真的。考虑

union Pad {
    char arr[sizeof (double) + 1];
    double d;
};

该工会最大的成员是arr. 但通常, adouble将在四或八字节的倍数上对齐(取决于架构和大小double)。在某些架构上,这甚至是必要的,因为它们根本不支持未对齐的读取。

所以sizeof (union Pad)通常大于sizeof (double) + 1[通常16 = 2 * sizeof (double)在 64 位系统上,在 32 位系统上为 16 或 12(在具有 8 位char和 64 位的 32 位系统上double,所需的对齐double可能仍然只有四个字节) ]。

这意味着联合中必须有填充,并且只能放在最后。

通常,a 的大小union将是不小于最大成员的任何成员所需的最大对齐的最小倍数。

于 2013-05-25T13:21:48.697 回答
-2

当我们在其中使用原始类型时的联合

union
{
    char c;
    int x;
}

似乎它不使用填充,因为最大大小的数据无论如何都与边界对齐。

但是当我们在 union 中嵌套一个结构时,它会这样做。

    union u
    {
        struct ss
        {
            char s;
            int v;
        }xx;
    }xu;

结果是8号。

所以你的问题的答案是 PADDING 在 UNION 中存在。

于 2013-05-25T12:24:23.757 回答