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; } 解决方法
一般来说,这是正确的:它是更紧凑的存储与更快的访问之间的权衡. 例如,这是我的编译器为你的位域示例中的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 所有这些当然都是编译器和平台特定的. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |