Union和struct的内存分配区别

今天看到有一段程序里在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

一个网上的好例子:http://blog.chinaunix.net/u2/84450/showart_1829958.html

C/C++程序的编写中,当多个基本数据类型或复合数据结构要占用同一片内存时,我们要使用联合体;当多种类型,多个对象,多个事物只取其一时(我们姑且通俗地称其为“n 选1”),我们也
可以使用联合体来发挥其长处。首先看一段代码:
union myun
{
struct { int x; int y; int z; }u;
int k;
}a;
int main()
{
a.u.x =4;
a.u.y =5;
a.u.z =6;
a.k = 0;
printf("%d %d %d\n",a.u.x,a.u.y,a.u.z);
return 0;
}
union类型是共享内存的,以size最大的结构作为自己的大小,这样的话,myun这个结构就包含u这个结构体,而大小也等于u这个结构体的大小,在内存中的排列为声明的顺序x,y,z从低到高,然后赋值的时候,在内存中,就是x的位置放置4,y的位置放置5,z的位置放置6,现在对k赋值,对k的赋值因为是union,要共享内存,所以从union的首地址开始放置,首地址开始的位置其实是x的位置,这样原来内存中x的位置就被k所赋的值代替了,就变为0了,这个时候要进行打印,就直接看内存里就行了,x的位置也就是k的位置是0,而y,z的位置的值没有改变,所以应该是0,5,6

原文链接: https://www.cnblogs.com/luoyaoquan/archive/2011/05/04/2037080.html

欢迎关注

微信关注下方公众号,第一时间获取干货硬货;公众号内回复【pdf】免费获取数百本计算机经典书籍

    Union和struct的内存分配区别

原创文章受到原创版权保护。转载请注明出处:https://www.ccppcoding.com/archives/24948

非原创文章文中已经注明原地址,如有侵权,联系删除

关注公众号【高性能架构探索】,第一时间获取最新文章

转载文章受原作者版权保护。转载请注明原作者出处!

(0)
上一篇 2023年2月8日 上午2:51
下一篇 2023年2月8日 上午2:51

相关推荐