免费注册 查看新帖 |

Chinaunix

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

[C] 关于结构大小的一个问题 [复制链接]

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

struct s1 {
  char a:5;
  int    b:1;
  int    c:6;
  char d:5;
  int    e:12;
}

struct s2 {
  char a:5;
  int    b:1;
  int    c:6;
  char d:4;
  int    e:12;
}

在64位ubuntu上gcc, sizeof(s1) = 8, sizeof(s2) = 4.

有清楚的大侠稍微解释下原因。

有尝试了如下结构:
struct s3 {
  int    a:5;
  int    b:1;
  int    c:6;
  int    d:5;
  int    e:12;
}
sizeof(s3) = 4

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
2 [报告]
发表于 2015-01-08 11:18 |只看该作者
你确定代码能够编译通过吗?
为啥我尝试了一下
编译器提示错误了呢?
aa.c|17 col 7| 错误: 重复的成员‘c’  

求职 : 机器学习
论坛徽章:
79
2015年亚洲杯纪念徽章
日期:2015-05-06 19:18:572015七夕节徽章
日期:2015-08-21 11:06:172015亚冠之阿尔纳斯尔
日期:2015-09-07 09:30:232015亚冠之萨济拖拉机
日期:2015-10-21 08:26:3915-16赛季CBA联赛之浙江
日期:2015-12-30 09:59:1815-16赛季CBA联赛之浙江
日期:2016-01-10 12:35:21技术图书徽章
日期:2016-01-15 11:07:2015-16赛季CBA联赛之新疆
日期:2016-02-24 13:46:0215-16赛季CBA联赛之吉林
日期:2016-06-26 01:07:172015-2016NBA季后赛纪念章
日期:2016-06-28 17:44:45黑曼巴
日期:2016-06-28 17:44:4515-16赛季CBA联赛之浙江
日期:2017-07-18 13:41:54
3 [报告]
发表于 2015-01-08 11:21 |只看该作者
int    c:6;
  char c:5;
这两个类型重名了啊

论坛徽章:
0
4 [报告]
发表于 2015-01-08 11:23 |只看该作者
抱歉,手误。代码在虚拟机里,没直接拷贝。

论坛徽章:
0
5 [报告]
发表于 2015-01-09 09:52 |只看该作者
有高手能指点一下不?

论坛徽章:
0
6 [报告]
发表于 2015-01-09 10:22 |只看该作者
本帖最后由 雷男 于 2015-01-09 10:23 编辑

       1) 如果相邻位域字段的类型相同,且其位宽之和小于类型的sizeof大小,则后面的字段将紧邻前一个字段存储,直到不能容纳为止;
       2) 如果相邻位域字段的类型相同,但其位宽之和大于类型的sizeof大小,则后面的字段将从新的存储单元开始,其偏移量为其类型大小的整数倍;
       3) 如果相邻的位域字段的类型不同,则各编译器的具体实现有差异,gcc通常采用压缩的方式;
       4) 如果位域字段之间穿插着非位域字段,则不进行压缩;
       5) 整个结构体的总大小为对齐方式的整数倍。对齐方式是最宽基本类型成员大小和默认对齐方式的较小者。

=========

struct s1 {
  char a:5;   
  int    b:1;   5+1 < 8bits  == 1byte

  int    c:6;   1byte

  char d:5;     
  int    e:12;  5+12=17>16bits = 3bytes
}

1+1+3=5bytes,然而总结构体大小必须为sizeof(int)4的倍数,因此为8

下面那个就不用多说了吧
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP