C位域内存使用情况

我需要以下面的forms处理一些数据:

typedef struct{ unsigned n1 : 12; unsigned n2 : 12; unsigned n3 : 12; unsigned n4 : 1; unsigned n5 : 35; } data; 

我确保它们总共可以计算9个字节。
但他们没有..将该结构的9个字节写入文件并将其读回不会恢复所有数据,而sizeof(data)返回16。
这有什么问题?

问题是由于效率原因,编译器正在添加一些填充。

可以覆盖此行为。

有关如何使用gcc执行此操作,请参阅GCC中的强制对齐

有关如何使用visual c ++执行此操作,请参阅: 在Visual C ++中强制对齐

您的结构长度为9个字节。 编译器将其填充到16个字节以更加缓存友好。 这可以使用特定于编译器的指令/关键字关闭(我不建议一般)。 请参阅数据结构对齐 。

您可以使用gcc特定的强制对齐:

 typedef struct{ unsigned n1 : 12; unsigned n2 : 12; unsigned n3 : 12; unsigned n4 : 1; unsigned n5 : 35; } data __attribute__((__packed__)); 

阅读: http : //gcc.gnu.org/onlinedocs/gcc-3.2.3/gcc/Type-Attributes.html

这在36位计算机上非常有效。 你忘了告诉我们这是不是你有…

在更常见的32位机器上,使用9字节对齐将非常难以实现。 如果创建这些结构的数组,则需要使用不同的代码来访问地址为0的对象中的字段和地址为模9的对象中的字段。

前三个字段的12位必须从不同的unsigned s中收集,并且根据地址的不同而不同。

除非您的硬件具有位寻址(或36位CPU),否则其他答案中的打包指令不太可能在此处起作用。