sizeof没有显示预期的输出

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个字节.有人可以解释一下吗.谢谢

oua*_*uah 6

从C标准:

(C99,6.7.2.1p10)"[......]如果剩余空间不足,是否将不适合的位域放入下一个单元或重叠相邻单元是实现定义的."

因此,在您的实现不重叠:ab成员都在一个单元,cd在另一个单元和e在另一个单位:8 + 8 + 8 = 24.


Joh*_*yHK 6

对于64位机器,字段ab使用结构中第一个64位值的60位,cd使用结构中下一个64位值的60位,然后因为e是8位,它不能适合从该64位值遗留下来的4位,因此需要另一个64位值.因此8x3 = 24字节.