union和struct的sizeof()

1.联合体与结构体的大小

联合和结构体的内存占用是不同的方式,同时还有字节对齐等设计,所以需要记住其区别。

https://blog.csdn.net/ziyouhahaze/article/details/48914757

这篇文章讲的不错

 本质:

 结构体中不同的成员使用不同的存储空间,一个结构所占的内存大小是结构中每个成员所占内存大小的总和,结构体中每个成员相互独立,是不能占用同一存储单元的。
        联合大小取决于其中最大的数据类型内存分配大小,联合中内存是叠加存放的。

  那么不同位的电脑,比如32位和64位的电脑的int,char等类型的大小有区别吗?是多少呢?

https://www.cnblogs.com/reality-soul/p/6141074.html)

什么是32位编译器,什么是32位电脑CPU呢?

https://blog.csdn.net/lgyuWT/article/details/85160036

简单来说,32位的cpu,其能寻址的物理地址的字节数是2^32=4GB,64位呢,其地址总线能寻址到8G。

再来看,编译器,编译器可以使用虚拟内存地址。这样话,64位机也可以32位编译器。反过来应该是不行的。

2.字节对齐

  那么结构体是否直接把元素占的字节数相加就可以了呢?不止,还需要字节对齐操作。联合体也是

为啥呢?因为:

  在用sizeof运算符求算某结构体所占空间时,并不是简单地将结构体中所有元素各自占的空间相加,这里涉及到内存字节对齐的问题。从理论上讲,对于任何 变量的访问都可以从任何地址开始访问,但是事实上不是如此,实际上访问特定类型的变量只能在特定的地址访问,这就需要各个变量在空间上按一定的规则排列, 而不是简单地顺序排列,这就是内存对齐。

内存对齐的原因:

1)某些平台只能在特定的地址处访问特定类型的数据;

2)提高存取数据的速度。比如有的平台每次都是从偶地址处读取数据,对于一个int型的变量,若从偶地址单元处存放,则只需一个读取周期即可读取该变量;但是若从奇地址单元处存放,则需要2个读取周期读取该变量。

如何对齐呢?规则是:

结构体总的大小要是其成员中最大size的整数倍,如果不是编译器会在其末尾添加填充字节。

举例:(https://blog.csdn.net/weixin_42423872/article/details/81229249)

总结来说

字节对齐:结构或联合的成员处于特定的地址
1.每个成员要在能被其空间大小整除的地址
2.整体结构大小要为最大成员空间大小的整数倍

3.如果成员空间大小大于平台对齐字节大小,则按平台对齐字节大小算

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值