大家好,
我想知道union是否使用了padding?
由于 union 的大小是最大的数据成员大小,最后可以有填充吗?
问问题
7239 次
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 回答