c/c++语言开发共享c结构中的压缩位字段 – GCC

我在linux上使用c中的结构。 我开始使用位字段和“打包”属性,我遇到了一个奇怪的行为:

struct t1 { int a:12; int b:32; int c:4; }__attribute__((packed)); struct t2 { int a:12; int b; int c:4; }__attribute__((packed)); void main() { printf("%dn",sizeof(t1)); //output - 6 printf("%dn",sizeof(t2)); //output - 7 } 

为什么两个结构 – 完全相同 – 采用不同的字节数?

    你的结构不是“完全一样”。 您的第一个具有三个连续的位字段,第二个具有一个位字段,一个(非位字段)int,然后是第二个位字段。

    这很重要:连续(非零宽度)位字段合并到单个存储器位置 ,而位字段后跟非位字段是不同的存储器位置。

    您的第一个结构有一个内存位置,第二个结构有三个。 您可以在第二个结构中获取b成员的地址,而不是第一个结构中的地址。 对b成员的访问不会与第二个结构中的ac竞争,但它们会在您的第一个结构中进行。

    在位字段成员在一个sens中“关闭”它之后立即具有非位字段(或零长度位字段),接下来将是不同的/独立的存储器位置/对象。 编译器不能像在第一个结构中那样将b成员“打包”在位字段内。

     struct t1 // 6 bytes { int a:12; // 0:11 int b:32; // 12:43 int c:4; // 44:47 }__attribute__((packed)); struct t1 // 7 bytes { int a:12; // 0:11 int b; // 16:47 int c:4; // 48:51 }__attribute__((packed)); 

    regular int b必须与字节边界对齐。 所以之前有填充。 如果你把c放在旁边,这个填充将不再是必要的。 你可能应该这样做,因为访问像int b:32这样的非字节对齐的整数很慢。

    需要了解更多c/c++开发分享c结构中的压缩位字段 – GCC,也可以关注C/ C++技术分享栏目—计算机技术网(www.ctvol.com)!

      以上就是c/c++开发分享c结构中的压缩位字段 – GCC相关内容,想了解更多C/C++开发(异常处理)及C/C++游戏开发关注计算机技术网(www.ctvol.com)!)。

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

      ctvol管理联系方式QQ:251552304

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

      (0)
      上一篇 2021年12月14日
      下一篇 2021年12月14日

      精彩推荐