我需要以下面的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),否则其他答案中的打包指令不太可能在此处起作用。
以上就是c/c++开发分享C位域内存使用情况相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。
本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。
ctvol管理联系方式QQ:251552304
本文章地址:https://www.ctvol.com/c-cdevelopment/562434.html