C++中struct和union的区别

C++中struct和union的区别

1. 二者都是由不同的数据类型成员组成(否则也不需要定义这俩),但在任何同一时刻, 结构体存放所有的成员变量, 而共用体只存放一个被选中的成员。
2. 对于共用体的不同成员赋值,将会对其他成员重写, 原来成员的值就不存在了, 而对于结构体的不同成员赋值是互不影响的。比如:

在这里插入图片描述

3. 内存分配上有所不同,struct每个元素都有自己的内存空间,且们在内存中的存放是有先后顺序的,顺序就是你声明变量的顺序;union 的不同之处就在于,它所有的元素共享同一内存单元,且分配给union的内存size 由类型最大的元素 size 来确定。正因如此,当为一个struct和union分配内存时,内存对齐不同。

(1)union的大小为其内部所有变量的最大值,按照最大类型的倍数进行分配大小。如下:
 

typedef Union 
{
char c[10];
char cc1;
}u11;

typedef union 
{
char c[10];
int i;
}u22;

typedef union 
{
char c[10];
double d;
}u33;

sizeof(u11)结果是10
sizeof(u22)结果是12,按照sizeof(int)*3分配空间
sizeof(u33)结果是16,按照sizeof(double)*2分配空间。

(2)结构体struct分配方法类似,也是按照最大类型的倍数进行分配大小,但是还与顺序有关。如下:
 

typedef struct s1
{
char c;
double d;
}s11;


typedef struct s2
{
char c;
char cc;
double d;
}s22;

typedef struct s3
{
char c;
double d;
char cc;
}s33;

sizeof(s11)结果是应该是9,但是系统按照sizeof(double)*2分配,所以大小是16

sizeof(s22)结果是应该是10,但是系统按照sizeof(double)*2分配,所以大小是16,先分配8字节给c,c占用一个字节,剩余7字节可以存储cc,所以系统没有额外给cc分配内存。cc有了内存后剩余6字节无法存储d,系统就额外为d分配8字节,整个分配浪费内存6字节。

sizeof(s33)结果是应该是10,但是系统按照sizeof(double)*3分配,所以大小是24,因为和定义顺序有关,所以当给c分配8个字节之后,剩余7个字节无法存储d,所以系统又分配了8个字节给d,之后又分配8个自己给cc,分配完后浪费了14个字节的空间。所以,在定义结构体struct 的时候按照s22的顺序分配可以节省内存。

 

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值