加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 百科 > 正文

C编译器如何处理位字段?

发布时间:2020-12-16 10:03:48 所属栏目:百科 来源:网络整理
导读:以下位字段示例代码来自 here.它声称存储效率更高.但我想知道编译器如何处理位字段? 我猜C编译器已经为逐位操作生成了额外的指令.因此,尽管数据大小减小,但代码大小也会增加. 任何熟悉C编译器的人都可以解释一下吗? #include stdio.h// A space optimized
以下位字段示例代码来自 here.它声称存储效率更高.但我想知道编译器如何处理位字段?

我猜C编译器已经为逐位操作生成了额外的指令.因此,尽管数据大小减小,但代码大小也会增加.

任何熟悉C编译器的人都可以解释一下吗?

#include <stdio.h>

// A space optimized representation of date
struct date
{
   // d has value between 1 and 31,so 5 bits
   // are sufficient
   unsigned int d: 5;

   // m has value between 1 and 12,so 4 bits
   // are sufficient
   unsigned int m: 4;

   unsigned int y;
};

int main()
{
   printf("Size of date is %d bytesn",sizeof(struct date));
   struct date dt = {31,12,2014};
   printf("Date is %d/%d/%d",dt.d,dt.m,dt.y);
   return 0;
}

解决方法

So although the data size is reduced,the code size is increased.

一般来说,这是正确的:它是更紧凑的存储与更快的访问之间的权衡.

例如,这是我的编译器为你的位域示例中的printf语句生成的:

movq    _dt@GOTPCREL(%rip),%rax
    movzwl  (%rax),%edx
    movl    %edx,%esi
    andl    $31,%esi     ; -- extract the 5 bits representing day
    shrl    $5,%edx      ; -+ extract the four bits for the month
    andl    $15,%edx     ; /
    movl    4(%rax),%ecx ; -- year doesn't require any bit manipulation
    leaq    L_.str.1(%rip),%rdi
    xorl    %eax,%eax
    callq   _printf

为了比较,当date是一个简单的结构时,相同的代码:

movq    _dt@GOTPCREL(%rip),%rax
    movl    (%rax),%esi  ; -- day
    movl    4(%rax),%edx ; -- month
    movl    8(%rax),%ecx ; -- year
    leaq    L_.str.1(%rip),%eax
    callq   _printf

所有这些当然都是编译器和平台特定的.

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读