struct与unin的区别

struct 简单来说就是一些相互关联的元素的集合,说是集合,其实它们在内存中的存放是有先后顺序的,并且每个元素都有自己的内存空间。那么按照什么顺序存放的呢?其实就是按你声明的变量顺序来存放的,下面先看一个例子:

struct sTest

{

int a;  //sizeof(int) = 4

char b;  //sizeof(char) = 1

shot c; //sizeof(shot) = 2

}x;

所以在内存中至少占用 4+1+2 = 7 byte。然而实际中占用的内存并不是7 byte,这就涉及到了字节对齐方式,可以参考转载的《struct 字节对齐分析》,介绍的还是不错的。

 

union 的不同之处就在于,它所有的元素共享同一内存单元,且分配给union 的内存 size 由类型最大的元素 size 来确定,如下的内存就为一个double 类型 size :

union uTest

{

int a;   //sizeof(int) = 4

double b;  //sizeof(double) = 8

char c;  //sizeof(char) = 1

}x;

所以分配的内存 size 就是8 byte。

既然是内存共享,理所当然地,它不能同时存放多个成员的值,而只能存放其中的一个值,就是最后赋予它的值,如:

x.a = 3; x.b = 4.5; x.c = ‘A’;

这样你只看到x.c = ‘A’,而其它已经被覆盖掉,失去了意义。

 

说到这里,大家应该已经明白两者最关键的区别了吧,无非就在于内存单元的分配和使用。然而要灵活地使用 struct 和 union 还是存在许多小技巧的,比如:元素的相关性不强时,完全是可以使用union ,从而节省内存size; struct和 union 还可以相互嵌套。


http://blog.163.com/zhangsumei0712@126/blog/static/1043778322008111194755670/?COLLCC=3146474783&

http://www.letuknowit.com/archives/81


出个题,union{long,int k[5],char c}Date;

        struct{int,char,Date,char c[6]}AA;

那么,sizeof(Date)+sizeof(AA)=???


首先很容易看出来union的大小为20,那么接下来看看struct,int(4)+char(1)=5,Date中最长的类型为4(int和long),那么5不是4的倍数,所以添加3,那么=8是4的倍数了,接着8+Date(20)=28,是1(char)的倍数,总长,28+6(char c【6】)=34,而且,struct中最长的类型为4(int以及Date中最长的类型),但是呢,34不是4的整数倍,需要+2补齐,所以sizeof(AA)=36。所以呢,sizeof(Date)+sizeof(AA)=36+20=56,这个是宇视的笔试题,当时想了好久。。哈哈

至于struct的规则呢,请看http://blog.csdn.net/sun5smile/article/details/8919469

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值