联合中的填充是否存在

aka*_*ash 9 c struct padding unions

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

Dan*_*her 15

因为union的大小是最大的数据成员大小

这不一定是真的.考虑

union Pad {
    char arr[sizeof (double) + 1];
    double d;
};
Run Code Online (Sandbox Code Playgroud)

该联盟中最大的成员是arr.但通常情况下,a double将在四个或八个字节的倍数上对齐(取决于架构和大小double).在某些体系结构上,这甚至是必要的,因为它们根本不支持未对齐的读取.

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

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

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


Din*_*mar -2

当我们与其中的原始类型一起使用时并集

union
{
    char c;
    int x;
}
Run Code Online (Sandbox Code Playgroud)

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

但是当我们在联合中嵌套一个结构时,它就会发生。

    union u
    {
        struct ss
        {
            char s;
            int v;
        }xx;
    }xu;
Run Code Online (Sandbox Code Playgroud)

结果是 8 号。

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