sizeof没有显示预期的输出

时间:2013-01-07 19:38:16

标签: 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));
}

我正在尝试在64位机器上编译它。预期的产量是16,但我得到了24。 我知道这里发生了一些对齐,但我不确定为什么结构x正好是16个字节。 有人可以解释一下吗。 感谢

3 个答案:

答案 0 :(得分:6)

来自C标准:

  

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

因此,在您的实施中,它们不会重叠:ab成员位于一个单元中,cd位于另一个单元中,{{1在另一个单元中:e

答案 1 :(得分:6)

对于64位计算机,字段ab使用结构中第一个64位值的60位,cd使用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;