【发布时间】:2015-02-18 09:45:19
【问题描述】:
假设我有这样的代码:
#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 (2) 上的 clang 有不同的结果,有人告诉我在 Windows 上它返回了 (3)。不确定我是否理解得很好,但我看到虽然第一个编译器将结构压缩为 9+7 = 16 位,但另一个使用 16 位 uint16_t 和 8 位 uint8_t。能给个建议吗?
【问题讨论】:
-
建议什么?你想要什么?你为什么要担心?当然,不同平台上的不同编译器在实现细节方面会做不同的事情……
-
除非您插入未命名的、大小为零的位域,否则您不能对位域的布局做出任何假设。
-
建议:如果内存布局或大小很重要,请不要使用位域,因为几乎没有任何保证。
-
您可以在 Windows 上通过将它们都设为 uint16_t 来将它们打包为 2 个字节。
标签: c struct bit-fields