c/c++语言开发共享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),否则其他答案中的打包指令不太可能在此处起作用。

      以上就是c/c++开发分享C位域内存使用情况相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

      本文来自网络收集,不代表计算机技术网立场,如涉及侵权请联系管理员删除。

      ctvol管理联系方式QQ:251552304

      本文章地址:https://www.ctvol.com/c-cdevelopment/562434.html

      (0)
      上一篇 2021年2月4日
      下一篇 2021年2月4日

      精彩推荐