社区
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位机器。。
求高手给出详细的解释。。
...全文
448
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写文章
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
数据处理救星降世Power Query
0/ Excel数据处理新利器来了,准备好了吗? 1/ 比网红函数VLOOKUP还全面的功能。——查(查询) 2/ 取其精华,去其糟粕。...——聚(聚合) 9/ 我自己的难题自己造函数,不
求教
别人。——技法(自定义函数)
大端模式与小端模式,超级经典
大端模式与小端模式一、概念及详解 在各种体系的计算机中,通常采用的
字节
存储机制主要有两种:big-endian和little-endian,即大端模式和小端模式。 先回顾两个关键词,MSB和LSB: MSB:Most Significant Bit ------- 最高有效位 LSB:Least Significant Bit ------- 最低有效位 大端模式(big-edia
题解 | #将两个 SELECT 语句结合起来(二)#
bo投递,跟面试官和hr沟通了一下,运去哪也是不进行校招,都是进行实习转正,大概明年年初确定转正名额,听面试官说现在有4个,计划再招2个,应该是 6进3 或者。得物24届秋招内推!金九的末尾了,记一下秋招的经历----offer-------无------池子-------华为 上海无线 泡池子荣耀 无线协议工程师 录用决策中oppo 无。弹头所总包18w(包含七险两金),武汉房价便宜离家近点(家在河南洛阳),毕竟是三江集团的,觉得发展会好点,但是不确定,网上有说好的也有说不好的,角度不一样吧。
GDB的使用方法
http://blog.163.com/zhuzhihua128@126/blog/static/33283531201021752827201/ 查看源程序 ————— 一、显示源代码 GDB 可以打印出所调试程序的源代码,当然,在程序编译时一定要加上-g的参数,把 源程序信息编译到执行文件中。不然就看不到源程序了。当程序停下来以后, GDB会报告程序停在了那个文件的
Linux内核设计与实现(19)--可移植性
可移植性是指代码从一种体系结构移植到另外一种体系结构的方便程度。Linux是
一个
可移植性非常好的操作系统,它广泛支持许多不同体系结构的计算机。 1.可移植操作系统 可移植性往往是与性能相矛盾的,Linux在这个方面走的是中间路线。差不多所有的接口和核心代码独立于硬件体系结构的C语言代码。但是对性能要求很严格的部分,内核的特性会根据不同的硬件体系进行调整。需要快速执行的和底层
C语言
69,373
社区成员
243,080
社区内容
发帖
与我相关
我的任务
C语言
C语言相关问题讨论
复制链接
扫一扫
分享
社区描述
C语言相关问题讨论
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章