联合中的填充是否存在

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

因为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位double精度数, double所需的对齐可能仍然只有4个字节)]。

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

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

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

 union { char c; int x; } 

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

但是当我们将一个结构嵌入到联合中时,它确实如此

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

结果是8号。

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