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个字节,还是取决于字节顺序?
有些理由被赞赏。
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:
联合的大小足以包含其最大的成员。最多一个成员的值可以随时存储在联合对象中。指向经过适当转换的联合对象的指针指向其每个成员(或者如果成员是位域,则指向它所在的单位),反之亦然。
这意味着联盟的所有成员的地址是相同的。
不是这样,它们可以由于填充而从不同的位置开始。请参阅下面链接的ELF标准中的图3.5。这是联盟/结构定义中的字段声明顺序的一个例子。 – user209051 2011-06-15 04:54:08
@ user209051:错误。假设你的意思是图3-6(3-5是一个结构),请注意位字段在右侧用低地址表示,在左侧用高地址表示。填充发生在成员之后(地址更高)。 – 2011-06-16 04:42:39
这真的取决于该平台的ELF-ABI。请参阅http://www.sco.com/developers/devspecs/abi386-4.pdf第3.1节中的示例和数据。它显示如果由于对齐限制而存在填充,则它不需要从低地址开始。
错了。看到我对我的答案的评论。 ELF ABI对于C语言不具有权威性/规范性。 – 2011-06-16 04:44:07
在实际操作中,较短的类型将始终处于开始位置,但我不确定是否或在哪里拼写出来...... – 2011-06-15 02:15:32