【C语言】如何计算结构体大小-----内存对齐(图文讲解)

计算结构体大小时,并不是单纯的将成员大小相加,而是要考虑结构体内存对齐规则。

结构体内存对齐规则:

1.第一个结构体成员,在结构体变量首地址偏移量为0的地址处(第一个成员不需要对其,但具有对齐数);
【C语言】如何计算结构体大小-----内存对齐(图文讲解)
2。除第一个成员外,其他成员变量存储时都要对应到对齐数的整数倍的地址处;
对齐数=编译器默认对齐数与该成员大小中的较小值(vs默认值为8,Linux默认值为4)

通过代码探究其存储方式:

例1:
【C语言】如何计算结构体大小-----内存对齐(图文讲解)
【C语言】如何计算结构体大小-----内存对齐(图文讲解)
3.结构体总大小为最大对其数的整数倍;

4.若结构体中嵌套了结构体,嵌套结构体对齐到自己最大的整数倍处。
例2:
【C语言】如何计算结构体大小-----内存对齐(图文讲解)

为什么要内存对齐

1.平台原因(移植原因)
不是所有的硬件平台都能访问任意地址上的数据;某些硬件平台只能只在某些地址访问某些特定类型的数据,否则抛出硬件异常。
2.性能原因
结构体中可以存放不同类型的数据,若不进行内存对齐就会形成下图所示的存储方式
【C语言】如何计算结构体大小-----内存对齐(图文讲解)
CPU在读取内存时是一块一块读取的,如上图所示,若CPU想要获取int i的数据,假设cpu一次读取的内存为4字节,就需要进行两次内存访问
【C语言】如何计算结构体大小-----内存对齐(图文讲解)
而内存对齐的内存访问只需要一次访问
总的来说,内存对齐是一种以空间换时间的做法