adi*_*hit 7 c structure sizeof bit-fields
#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));
}
Run Code Online (Sandbox Code Playgroud)
我想在64位机器上编译它.预期的输出是16但我得到24.我知道这里发生了一些对齐,但我不确定为什么结构x正好是16个字节.有人可以解释一下吗.谢谢
从C标准:
(C99,6.7.2.1p10)"[......]如果剩余空间不足,是否将不适合的位域放入下一个单元或重叠相邻单元是实现定义的."
因此,在您的实现不重叠:a和b成员都在一个单元,c并d在另一个单元和e在另一个单位:8 + 8 + 8 = 24.
对于64位机器,字段a并b使用结构中第一个64位值的60位,c并d使用结构中下一个64位值的60位,然后因为e是8位,它不能适合从该64位值遗留下来的4位,因此需要另一个64位值.因此8x3 = 24字节.