C 不同大小成员的联合内存布局?

C 不同大小成员的联合内存布局?,c,unions,C,Unions,这里的int和是4个字节,而其他的是8个字节 当我们将fd设置为int时,它是位于前4个字节还是最后4个字节,还是取决于endianness 理解一些原因。它位于前4个字节。根据C99标准§6.7.2.1/14(C11和C18中的§6.7.2.1/16): 工会的规模足以容纳其最大的成员。在任何时候,联合对象中最多可以存储一个成员的值。经过适当转换的联合对象指针指向其每个成员(如果成员是位字段,则指向其所在的单元),反之亦然 这意味着联盟所有成员的地址都是相同的。这实际上取决于该平台的ELF-A

这里的
int
是4个字节,而其他的是8个字节

当我们将
fd
设置为
int
时,它是位于前4个字节还是最后4个字节,还是取决于endianness


理解一些原因。

它位于前4个字节。根据C99标准§6.7.2.1/14(C11和C18中的§6.7.2.1/16):

工会的规模足以容纳其最大的成员。在任何时候,联合对象中最多可以存储一个成员的值。经过适当转换的联合对象指针指向其每个成员(如果成员是位字段,则指向其所在的单元),反之亦然


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

这实际上取决于该平台的ELF-ABI。请参阅第3.1节中给出的示例和数字,其中显示,如果由于对齐约束而存在填充,则不需要从低地址开始。

实际上,较短的类型将始终位于开头,但我不确定是否或在何处详细说明了这一点……不正确,它们可以由于填充而从不同的位置开始。参见下面链接的ELF标准中的图3.5。这是联合/结构定义中字段声明顺序如何起作用的一个示例。@user209051:错误。假设您指的是图3-6(3-5是一个结构),请注意,位字段的右边是低地址,左边是高地址。填充发生在成员之后(地址较高)。错误。见我对我的回答的评论。ELF ABI不是C语言的权威/规范。
typedef union epoll_data
{
  void        *ptr;
  int          fd;
  __uint32_t   u32;
  __uint64_t   u64;
} epoll_data_t;