打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
关于union和struct的内存分配

关于union和struct的内存分配  

2009-10-28 10:32:16|  分类: dos系统c语言 |字号 订阅

今天看到有一段程序里在struct里面用了个Union,然后就突然想到了struct和Union的区别,
找了些资料后发现,struct和Union在内存分配的时候有区别,Union里的数据是公用一块内存……,所以给其分配的内存总是Union里面所定义的最大类型长度的整数倍。
     而struct里的数据跟Union不一样,它们不共享一块内存,他是按照struct里面定义的数据顺序来进行分配内存的,但是分配的基本单位(即:每分配一次的量)是struct里面所定义的最长的数据类型的长度
举个形象的例子:
struct里面定义的数据类型的顺序为:
int a;
char b;
double c;
那个系统分配给这个struct的内存空间是多少呢?
应该是16!
为什么呢?因为系统先分配8个字节用来放int,结果int只需要4个就够了,然后剩下的4个中的一个可以用来放后面的char,碰到double c时,因为此时的3个字节不能存下,所以再分配了一个8个字节来存放double c

试想下如果struct里面定义的数据类型的顺序为:
int a;
double b;
char c;
那个系统分给这个struct的内存空间又是多少呢?
应该是24!
知道为什么的吧?系统碰到int分给他8个字节存放,碰到double时,剩下的4个字节不足以存放,所以再分配了8个字节,再遇到char c时又分配了8个字节,这样系统其实是浪费了5个字节的空间。
所以在结构体里面最好按照类型从小到大的顺序来……
#include <iostream>
using namespace std;
struct A1
{
    char s;
    double b;
};
struct A2
{
    char s1;
    double b;
    char s;
};
struct A3
{
    char s1;
    char s3;
    double b;
};
union B1
{
    char a;
    double b;   
};
union B2
{
    char a;
    char a1;
    double b;
};
union B3
{
    char a;
    double b;
    char a1;
};
union B4
{
    int a[5];
    double b;
};
int main()
{
    cout<<sizeof(A1)<<endl;
    cout<<sizeof(A2)<<endl;
    cout<<sizeof(A3)<<endl;
    cout<<sizeof(B1)<<endl;
    cout<<sizeof(B2)<<endl;
    cout<<sizeof(B3)<<endl;
    cout<<sizeof(B4)<<endl;
    return 0;
}
运行结果为:
16
24
16
8
8
8
24
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
C++字节对齐与结构体大小
【转载】union和union用sizeof看字节对齐
union的用法
sizeof 以及 (含位域)的结构体 --- 内存对齐
【C++学习笔记】深入了解C++ 结构体与共用体,看这篇就够了!
计算结构体的大小(VC++)
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服