免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4097 | 回复: 3
打印 上一主题 下一主题

[学习分享] 求带位域结构体大小的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2015-07-18 10:59 |只看该作者 |倒序浏览
本帖最后由 huyang8615 于 2015-07-18 11:00 编辑

最近两次面试,都遇到同一个问题:
在32位系统下运行:
struct nnn{
   unsigned char a:4;
   unsigned char b:4;
   unsigned int  c:8;
   unsigned long d:8;
}xxx;

int main(void)
{
    unsigned char len;
    len = sizeof(xxx);
    printf("%d\n",len);
    return 0;
}


我开始理解成要4字节对齐,于是写的4
回来在电脑上测试,结果也是4,我开始以为我的理解是对的,但跟网友讨论,并非如此,百度了一份文章,有讲到:
这样写是为了节省空间,也就是说a只占了4位,另4位被b占了。
那么如此类推,很简单了,将所有的位域相加,除以8,然后不足8位的再加一个字节就是了。
也就是(4+4+8+/8 = 3; 那结果应该是3字节才对啊,怎么实际运行出来的是4呢?
我接着做实验:

这个是1跟我刚才说不足8位也要占一个字节,似乎还能说过去。
接着修改:

这个是4似乎也说得通   (4+4+8+16)/8 = 4
接着来:

这个就不好理解了,(4+4+16+16)/ 8 = 5   但为什么运行起来是8呢
还希望高手指点下,感激不尽!

论坛徽章:
0
2 [报告]
发表于 2015-07-19 20:49 |只看该作者
4字节对齐吧。

论坛徽章:
0
3 [报告]
发表于 2015-07-20 08:14 |只看该作者
谢谢2楼,不是四字节对齐,结构体空间计算有两个原则:
1.整体空间是:占用空间最大的成员(的类型)所占字节的整数倍。
2.数据对齐原则:内存按结构体成员成先后顺序排列,当排到该成员变量时,其前面已摆放的空间的大小必须是该成员类型大小的整数倍,如果不够则补齐,以此向后类推。
打个比方:
struct nnn{
   unsigned char a:4;
   unsigned char b:4;
   unsigned int  c:8;
   unsigned long d:8;
}xxx

这个里面最大的数据类型就是unsigned long 了,因此这个结构体所占的控件肯定是4字节的整数倍。
再看:假设地址是从0开始摆放,那么在32位里面,a,b,c,d都放在第0字节里面了,所占的位不同而已,结束地址指在1处,但由于要四字节对齐,因此整个结构体的大小就是4了。
再比如:
struct nnn{
   unsigned char a:4;
}xxx
这个结构体里面只有一个unsigned char,因此决定了这个结构体的空间大小是1字节的整数倍。
再看:假设地址从0开始,a就放在0字节的低4位,由于是1字节的整数倍,那么这个结构体就占1字节了。
。。。。

论坛徽章:
1
操作系统版块每日发帖之星
日期:2016-06-20 06:20:00
4 [报告]
发表于 2015-07-20 12:12 |只看该作者
看着有点小复杂
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP