union联合体大小问题

luhanwenboy 2005-08-08 08:08:31
#include <iostream.h>
#include <stdio.h>
union DATE
{
char a;
int i[5];
double b;
};
struct date
{
int j;
DATE d;
float f;
};
DATE max;

void main()
{
cout << sizeof( struct date ) << "\t" << sizeof(max) << endl;
}
用vc运行
为什么输出:40 24
...全文
501 11 打赏 收藏 转发到动态 举报
写回复
用AI写文章
11 条回复
切换为时间正序
请发表友善的回复…
发表回复
XBox360 2005-08-09
  • 打赏
  • 举报
回复
又学到了关于union的东西
mingzheng0609 2005-08-09
  • 打赏
  • 举报
回复
拜一下
R9R9R9 2005-08-09
  • 打赏
  • 举报
回复
另外对于:
union DATE
{
char a;
int i[5];
double b;
};
struct date
{
int j;
DATE d;
float f;
};

结构,联合,或者类的数据成员,第一个放在偏移为0的地方,以后每个数据成员的对齐,按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
而编译器默认为:
#pragma pack(8) //可以更改在:vc6中打开工程属性页,c/c++页,选择Code Generation分类,
在 Struct member alignment可以选择。


所以DATE的对齐方式就是以8的倍数开始的.

所以DATE的内存分存就如下:
jjjj****
dddddddd
dddddddd
dddddddd
bbbbbbbb
sizeof(date)=8+24+8=40

以上仅为个人所见..如有错误请大家指正.

对于:C++中的内存对齐问题与(#pragma pack)还有什么其他的疑问的话.请访问.这里将会比我讲清楚多了.
http://www.softhouse.com.cn/html/200506/2005061509212900008335.html
http://blog.vckbase.com/panic/archive/2005/04/02/4340.aspx



R9R9R9 2005-08-09
  • 打赏
  • 举报
回复
关于这个问题..刚刚在网上搜索了一下
http://blog.vckbase.com/smileonce/archive/2005/08/08/10658.html
union DATE
{
char a;
int i[5];
double b;
};

①联合就是一个结构,②它的所有成员相对于基地址的偏移量都为0,③此结构空间要大到足够容纳最“宽”的成员,④并且,其对齐方式要适合于联合中所有类型的成员。

该结构要放得下int i[5]必须要至少占4×5=20个字节。如果没有double的话20个字节够用了,此时按4字节对齐。但是加入了double就必须考虑double的对齐方式,double是按照8字节对齐的,所以必须添加4个字节使其满足8×3=24,也就是必须也是8的倍数,这样一来就出来了24这个数字。综上所述,最终联合体的最小的size也要是所包含的所有类型的基本长度的最小公倍数才行。(这里的字节数均指winnt下的值,平台、编译器不同值也有可能不同。)
lxk_cool 2005-08-08
  • 打赏
  • 举报
回复
对于sizeof( struct date )==40,仍然不怎么懂???
doway 2005-08-08
  • 打赏
  • 举报
回复
小土豆,你得看一下什么是 union。:)
mingzheng0609 2005-08-08
  • 打赏
  • 举报
回复
为什么不算char?
tyttytzhz 2005-08-08
  • 打赏
  • 举报
回复
vc6中默认packing size是8
我理解为 union DATE中int i[5] 4*5 = 20 + 4=24
struct date中 (4+4) + 24 + 8 = 40
doway 2005-08-08
  • 打赏
  • 举报
回复
对于 date 好像仍然不易解释,最后的尺寸 40 上看,好象应该是 8 + 24 + 8 的结果。

好像可以解释为 int j 后的 DATE d 的对齐,并不是按照 24 取的,而是取 DATE 中最大的类型 double b 的尺寸。

再以后的 float f 和整个 date d 仍然是按 8 取的。

doway 2005-08-08
  • 打赏
  • 举报
回复
看了文章,很受教育。

对于 max 来说,本应是 5*sizeof(int) 即 20,但 union 中最大的类型是 double 即 8,因此就取了大于 20 的最小的 8 的倍数,即 24。

tyttytzhz 2005-08-08
  • 打赏
  • 举报
回复
http://dev.csdn.net/Develop/article/42/42446.shtm

64,648

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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