社区
C语言
帖子详情
求教大家一个联合体所占字节大小的问题。
ccc43542876
2012-03-22 12:56:43
union student
{
char name[20];
double al;
char sex;
int age;
float height;
}stu;
声明了一个这样的联合体,如果把第二行double变量注释掉。sizeof(stu)。是20.联合体的大小就是占最大字节的那个大小。。
可是为什么加了double变量之后。sizeof(stu)就变成了24了?是VC6.0运行的。32位机器。。
求高手给出详细的解释。。
...全文
469
10
打赏
收藏
求教大家一个联合体所占字节大小的问题。
union student { char name[20]; double al; char sex; int age; float height; }stu; 声明了一个这样的联合体,如果把第二行double变量注释掉。sizeof(stu)。是20.联合体的大小就是占最大字节的那个大小。。 可是为什么加了double变量之后。sizeof(stu)就变成了24了?是VC6.0运行的。32位机器。。 求高手给出详细的解释。。
复制链接
扫一扫
分享
转发到动态
举报
AI
作业
写回复
配置赞助广告
用AI写文章
10 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
pathuang68
2012-03-22
打赏
举报
回复
sizeof(double) = 8bytes,因此这个联合体按8bytes对齐(按单个数据类型的最大者)。很显然就是24bytes了。这个东西在不同的编译器上可能会有不同的结果,比如用gcc去试试,结果又可能就是20bytes,我手头没有gcc编译器,有的朋友不妨试试。
muyi66
2012-03-22
打赏
举报
回复
又做了一些试验,证实了VS的对齐原则:
union的对齐原则就是使得对齐尺寸要求最大的数据类型得以满足。
char类型的对齐要求最小,只要1字节。
short的要2字节,int和float4字节,double最大需要8字节。
所以,当union里没有double时,LZ的union只需要满足int和float的要求,用4字节对齐。而添加了double后则更改为8字节对齐。
为了法克方便面
2012-03-22
打赏
举报
回复
为什么这么多这样的问题啊,默认是以最大的那个对齐的,double大小为8,以8对齐
设置对齐用下面的预编译指令
#pragma pack(N)
如果设置#pragma pack(4),大小就是20了,
muyi66
2012-03-22
打赏
举报
回复
想了这么个理由,不知道是否合适?
当所有的元素都不需要64位对齐时,union的对齐方式是32位对齐。若其中有元素需要64位对齐时,则union的对齐方式更改为64位对齐。
因为double类型是需要64位对齐的,所以加入它之后整个union的对齐方式更改为64位。于是,原本满足32位对齐而不满足64位对齐的size 20就变更为size 24,以满足64位对齐需求。
这样一来,就可以保证union中的double一定是对齐了边界的了。
muyi66
2012-03-22
打赏
举报
回复
说是内存对齐也很难解释:为什么不包含那个double的时候就不会发生呢?size=20的话,不也是32位对齐了吗?
muyi66
2012-03-22
打赏
举报
回复
没找到理由,关注。
蛮牛儿
2012-03-22
打赏
举报
回复
内存对齐问题
nfme
2012-03-22
打赏
举报
回复
边界对齐。
starsoft007
2012-03-22
打赏
举报
回复
因为字节对齐的原因吧,20不是8(double所占用字节数)的整数倍,24是大于二十的最小的8的整数倍。
pengfoo
2012-03-22
打赏
举报
回复
字节对齐问题,参见
http://blog.csdn.net/kuzuozhou/article/details/7278555
开源英雄 | 姜宁两度当选 Apache 软件基金会董事
2022 年 3 月 3 号,北京,凌晨 3 点 15 分,姜宁的手机上收到一条消息。十几分钟后,他突然醒来,下意识地摸到手机,睡眼惺忪地点开微信,看到方越的留言“恭喜你当选 Apache 软件基金会(Apache Software ...
大端模式与小端模式,超级经典
大端模式与小端模式一、概念及详解 在各种体系的计算机中,通常采用的
字节
存储机制主要有两种:big-endian和little-endian,即大端模式和小端模式。 先回顾两个关键词,MSB和LSB: MSB:Most Significant Bit ------...
题解 | #将两个 SELECT 语句结合起来(二)#
bo投递,跟面试官和hr沟通了一下,运去哪也是不进行校招,都是进行实习转正,大概明年年初确定转正名额,听面试官说现在有4个,计划再招2个,应该是 6进3 或者。得物24届秋招内推!金九的末尾了,记一下秋招的经历--...
题解 | #大数加法# StringBuilder + 数学
学校宣讲会,晚上6点半参加,一直等等等,一百多人排队面试,人都站麻了,最后在外面等了3个多小时,到了十点多才排到,而且去了就面2分钟。华虹平台大,Fab厂, 国企,工资低,但跳槽会涨薪,比较吃香,而且成都...
GDB的使用方法
...GDB 可以打印出所调试程序的源代码,当然,在程序编译时一定要加上-g的参数,把 源程序信息编译到执行文件中。不然就看不到源程序了。当程序停下来以后, GDB会报告程序停在了那个文件的
C语言
70,021
社区成员
243,263
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章