不同规模成员联合的记忆布局?

时间:2011-06-15 02:03:08

标签: c unions

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个字节,还是取决于字节顺序?

有些理由表示赞赏。

2 个答案:

答案 0 :(得分:28)

它位于前4个字节。根据C99标准§6.7.2.1/ 14:

  

联合的大小足以包含其最大的成员。最多一个成员的值可以随时存储在union对象中。指向适当转换的union对象的指针指向其每个成员(或者如果成员是位字段,则指向它所在的单位),反之亦然。

这意味着联盟所有成员的地址是相同的。

答案 1 :(得分:-1)

这实际上取决于该平台的ELF-ABI。请参阅http://www.sco.com/developers/devspecs/abi386-4.pdf中第3.1节中的示例和图示。它表明,如果由于对齐约束而存在填充,则无需从低地址开始。