C位字段内存使用情况

时间:2011-05-26 17:39:52

标签: c struct bit-fields

我需要以下列形式处理一些数据:

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

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

4 个答案:

答案 0 :(得分:8)

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

可以覆盖此行为。

有关如何使用gcc执行此操作,请参阅forcing alignment in GCC

有关如何使用visual c ++执行此操作,请参阅:forcing alignment in Visual C++

答案 1 :(得分:1)

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

答案 2 :(得分:1)

您可以使用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

答案 3 :(得分:0)

这在36位计算机上运行得非常好。你忘了告诉我们你是否有这个......

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

前三个字段的12位必须从不同的unsigned收集,具体取决于地址。

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