联合¶
与封装多块相关数据的结构不同,联合包含一块通过多个变量暴露的数据。联合遵循三条规则:
(cid:127)联合在内存中的大小等于其最大成员的大小。
(cid:127)联合的成员都引用同一块内存。
(cid:127)联合继承其最大成员的对齐方式。
下面代码中的 printf() 调用有助于说明前两条规则:
union {
BYTE byteValue;
struct {
WORD first;
WORD second;
} words;
DWORD value;
} dwValue;
dwValue.value = 0xDEADBEEF;
printf("Size %d\nAddresses 0x%x,0x%x\nValues
0x%x,0x%x\n",
sizeof(dwValue), &dwValue.value,
&dwValue.words,
dwValue.words.first, dwValue.words.second);
这次对 printf() 的调用输出以下内容:
第一条规则由首先打印的 Size 值说明。尽管 dwValue 有三个总共占用 9 字节的成员,但它的大小只有 4 字节。大小结果也验证了第二条规则,因为 dwValue.value 和 dwValue.words 都指向地址 0x2efda8,正如「地址」后打印的值所示。第二条规则也由 dwValue.words.first 和 dwValue.words.second 包含 0xbeef 和 0xdead(在「值」后打印)这一事实验证,考虑到 dwValue.value 是 0xdeadbeef,这是合理的。第三条规则在这个示例中没有演示,因为我们没有足够的内存上下文,但如果你把这个联合放进结构里,用你喜欢的任何类型包围它,它实际上总会像 DWORD 一样对齐。