大家好,
我想知道 union是否使用填充?
因为union的大小是最大的数据成员大小,所以最后可以填充吗?
答案 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位double
,double
所需的对齐方式可能仍然只有四个字节)]。
这意味着必须在联合中填充,并且只能放在最后。
通常,union
的大小将是任何不小于最大成员的成员所需的最大对齐的最小倍数。
答案 1 :(得分:-2)
联盟
union
{
char c;
int x;
}
似乎它不使用填充,因为最大尺寸的数据无论如何都与边界对齐。
但是当我们在一个结构中嵌入一个结构时,它确实存在。
union u
{
struct ss
{
char s;
int v;
}xx;
}xu;
结果是8号。
所以你的问题的答案是PADDING在UNION中占有一席之地。