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.如果成员空间大小大于平台对齐字节大小,则按平台对齐字节大小算