不同编译器的 sizeof(struct) 不同

sizeof(struct) different for different compilers

假设我有这样的代码:

#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 位,但另一个使用 uint16_t 的 16 位和 uint8_t 的 8 位。你能建议一下吗?

不确定我是否理解得很好,但我看到当第一个编译器将结构压缩到 9+7 = 16 位时,另一个使用 uint16_t 的 16 位和 uint16_t 的 8 位uint8_t。你能给点建议吗?

关于位域,首先要记住的是来自 K&R 的这句话,第二:

(6.9 Bit-fields) "Almost everything about fields is implementation-dependent."

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

可能会出现两种可能的问题:

位域是 ANSI C 规范中标准化程度很低的部分。编译器选择如何在位域中分配位 container.You 应避免在结构内部使用它们,而可以使用 #define 或枚举。

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

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