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(在C11和C18中为§6.7.2.1/16):
一个union的大小足以包含其最大成员。最多只能将一个成员的值存储在联合体对象中。适当转换后,指向联合对象的指针指向其每个成员(或者如果成员是位域,则指向其所在的单元),反之亦然。
这意味着联合体所有成员的地址都相同。
这实际上取决于该平台的ELF-ABI。请参见http://www.sco.com/developers/devspecs/abi386-4.pdf下3.1节中给出的示例和图表。它显示,如果由于对齐约束而存在填充,则不需要从低地址开始。