联合中的填充是否存在

时间:2013-05-25 12:01:50

标签: c struct padding unions

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

2 个答案:

答案 0 :(得分:14)

  

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

这不一定是真的。考虑

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

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

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

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

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

答案 1 :(得分:-2)

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

联盟

union
{
    char c;
    int x;
}

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

但是当我们在一个结构中嵌入一个结构时,它确实存在。

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

结果是8号。

所以你的问题的答案是PADDING在UNION中占有一席之地。