一.内存大小
想要明白结构体所占计算机内存大小,那就不得不先了解一下内存对齐了。
1.什么是内存对齐?
计算机在内存中取值的大小是固定的,就拿32位机来说,每次CPU的取值与处理只有32位,也就是4个字节。比如一个int型的数据占4个字节的大小,假如不在CPU的一次取值范围之内,则CPU需要取值两次然后运算得到这个int型数据。就增加了访问次数,为了避免这种情况,就出现了内存对齐这个概念。
内存对齐简单点说就是计算机为了保证运行效率以及兼容各类硬件平台而提出的。内存对齐的目的就是一次访存就读出数据,减少跨越访存边界的数据引起的访存开销。本质上就是以空间换时间。
2.源码分析
我们先来看第一个:
为什么是16个字节呢? 首先int占4个字节,我们假设初始地址为0x0,则其存储的地址为0x0-0x3,然后为char占1个字节,地址为0x4,紧接着来了一个double,一个double占8个字节,所以起始地址必须为8的倍数,则0x5-0x7空闲出来,从0x8开始存,存到0x15。一共占据16个字节。
继续看第二个:
为什么这次会是24呢,我只是将double c和char B的位置互换了一下而已;我们来继续分析一下,首先,跟前面一样,第一个int占的位置为0x0-0x3,但是第二个为double,起始地址需要为它的整数倍,为0x8-0x15,一个char占一个字节,为0x16,但是根据内存对齐原则,需要进行内存对齐,则需要补齐到7个字节,到0x23。所以占据24个字节。
个人见解,大神多多指教!