sizeof(struct)对于不同的编译器是不同的

时间:2015-02-18 09:45:20

标签: c struct bit-fields

假设我有这样的代码:

#include <stdio.h>
#include <stdint.h>
int main(int argc, char *argv[]) {
    typedef struct{
        uint16_t x : 9;
        uint8_t y : 7;
    } z;
    printf("sizeof(z) = %lu\n",sizeof(z));
}

我对Mac上的clang有不同的结果(2)有人在Windows上告诉我它返回(3)。不确定我是否理解它,但我看到,当第一个编译器将结构压缩为9 + 7 = 16位时,另一个使用16位uint16_t和8位uint8_t。你能建议吗?

2 个答案:

答案 0 :(得分:3)

不确定我是否理解它,但我看到,当第一个编译器将结构压缩为9 + 7 = 16位时,另一个使用16位uint16_t和8位uint8_t。你能告诉我吗?

关于比特字段要记住的第一件事是来自K&amp; R的这句话,第二部分:

  

(6.9比特字段)“关于字段的几乎所有内容都依赖于实现。”

它包括填充,对齐和位字节序。

答案 1 :(得分:0)

可能会出现两个问题:

位域是ANSI C规范中标准化程度很低的部分。编译器选择如何在位字段容器中分配位。您应该避免在结构中使用它们,而是可以使用#define或enum。

第二个可能的问题是编译器会通过添加填充来将结构放在内存中,以确保下一个对象与该对象的大小对齐。根据结构的大小放置结构的元素是一种很好的做法。 :

typedef struct{
        uint8_t x : 7;
        uint16_t y : 9;
    } z;