求教大家一个联合体所占字节大小的问题。

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 打赏 收藏 转发到动态 举报
写回复
用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字节对齐。
  • 打赏
  • 举报
回复
为什么这么多这样的问题啊,默认是以最大的那个对齐的,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
  • 打赏
  • 举报
回复

69,373

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧