我需要以下列形式处理一些数据:
typedef struct{
unsigned n1 : 12;
unsigned n2 : 12;
unsigned n3 : 12;
unsigned n4 : 1;
unsigned n5 : 35;
} data;
我确保总共最多可以计算9个字节
但他们没有..将该结构的9个字节写入文件并将其读回不会恢复所有数据,sizeof(data)
返回16.
这有什么问题?
答案 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),否则其他答案中的打包指令不太可能起作用。