#include <stdint.h>
#include <stdio.h>
typedef union {
uint64_t u[2];
struct {
uint64_t a:30;
uint64_t b:30;
uint64_t c:30;
uint64_t d:30;
uint64_t e:8;
}x;
} mystruct;
int main()
{
printf("Size %d\n", sizeof(mystruct));
}
我正在尝试在64位机器上编译它。预期的产量是16,但我得到了24。 我知道这里发生了一些对齐,但我不确定为什么结构x正好是16个字节。 有人可以解释一下吗。 感谢
答案 0 :(得分:6)
来自C标准:
(C99,6.7.2.1p10)“[......]如果空间不足, 是否将不适合的位域放入下一个单元或重叠相邻单元 实现定义“。
因此,在您的实施中,它们不会重叠:a
和b
成员位于一个单元中,c
和d
位于另一个单元中,{{1在另一个单元中:e
。
答案 1 :(得分:6)
对于64位计算机,字段a
和b
使用结构中第一个64位值的60位,c
和d
使用60位结构中的下一个64位值,然后因为e
是8位,它不能适应该64位值剩余的4位,因此需要另一个64位值。因此8x3 = 24字节。
答案 2 :(得分:3)
位域的元素永远不会与两个存储器“单元”重叠(在您的情况下,存储器单元是64位元素)。
除了位域实现依赖于编译器这一事实之外,您的位域结构有可能以下列方式存储在内存中:
struct {
uint64_t a:30;
uint64_t b:30;
uint64_t :4;
uint64_t c:30;
uint64_t d:30;
uint64_t :4;
uint64_t e:8;
uint64_t :56;
}x;