不同规模成员联合的记忆布局?
typedef union epoll_data { void *ptr; int fd; __uint32_t u32; __uint64_t u64; } epoll_data_t;
这里int
和__uint32_t
是4个字节,而其他是8个字节。
当我们将fd
设置为int
,它是位于前4个字节还是后4个字节,还是取决于字节序?
有些理由值得赞赏。
它位于前4个字节。 根据C99标准§6.7.2.1/ 14:
联合的大小足以包含其最大的成员。 最多一个成员的值可以随时存储在union对象中。 指向适当转换的union对象的指针指向其每个成员(或者如果成员是位字段,则指向它所在的单元),反之亦然。
这意味着联盟所有成员的地址是相同的。
这实际上取决于该平台的ELF-ABI。 请参阅http://www.sco.com/developers/devspecs/abi386-4.pdf中第3.1节中的示例和图表。它表明,如果由于对齐约束而存在填充,则无需从低地址开始。