社区
C++ 语言
帖子详情
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
打赏
收藏
union联合体大小问题
#include #include 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
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用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
错误:sem_
union
的存储
大小
未知
问题
的解决方法
随后编译时它就能找到预先定义好的sem_
union
联合体
了. Linux下编译时出现的错误及解决方法 (1)由于是Linux新手,所以现在才开始接触线程编程,照着GUN/Linux编程指南中的一个例子输入编译,结果出现
Float类型
大小
端转换测试程序
Float类型
大小
端转换测试程序 1、方法一使用了
联合体
。联合(
union
)变量的所有成员共享同片存储区/内存。 2、方法二使用了数组。
精品课:MySQL5.7零基础入门与实战(精讲)
union
all 09-数据排序 order by 10-小节 in,or,
union
11-统计函数 count 12- 统计函数 sum,avg 13- 统计函数max,min 14- 排重 distinct 15- 数据分组 group by&having 16- 分页limit 17- 字符串函数 18-日期...
C语言
联合体
union
占用空间
大小
问题
联合体
占用空间
大小
要遵循两个原则: 1.
大小
要足够容纳下所有成员的
大小
,也就是找到占用空间最大的元素 2. 占用空间最大的元素
大小
要可以被所有共用体成员类型整除开 3. 如果元素
大小
不可以被共用体某一个成员的...
用
联合体
(
union
)判断
大小
端
利用
联合体
的特点巧妙的实现
大小
端判断
C++ 语言
64,648
社区成员
250,503
社区内容
发帖
与我相关
我的任务
C++ 语言
C++ 语言相关问题讨论,技术干货分享,前沿动态等
复制链接
扫一扫
分享
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++
技术论坛(原bbs)
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
请不要发布与C++技术无关的贴子
请不要发布与技术无关的招聘、广告的帖子
请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下
试试用AI创作助手写篇文章吧
+ 用AI写文章