分享

关于union和struct的内存分配

 quasiceo 2014-01-15

关于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

    本站是提供个人知识管理的网络存储空间,所有内容均由用户发布,不代表本站观点。请注意甄别内容中的联系方式、诱导购买等信息,谨防诈骗。如发现有害或侵权内容,请点击一键举报。
    转藏 分享 献花(0

    0条评论

    发表

    请遵守用户 评论公约

    类似文章 更多