在讨论计算方法之前,我们先讨论一些概念,一个是偏移量,另一个是内存对齐. 让我来谈谈偏移量,百度百科将其定义为: 存储单元的实际地址与其所在的段的段地址之间的距离称为段内偏移量,也称为“有效地址”或抵消. ”在结构中,它可能是指结构变量中成员地址与结构变量地址之间的差异. 然后谈谈内存对齐的概念: 当在内存中存储基本类型的数据时,计算机系统将对其位置有所限制. 系统将要求这些数据的第一个地址的值是某个数字的倍数,该数字称为数据类型的对齐模数. 尽管ANSI C标准没有强制要求相邻声明的变量在内存中应该相邻,但是编译器会自动帮助您解决此问题,即,相邻变量之间可能会填充一些字节. 因此,在此问题上,编译器有所不同.
因此,我们首先来讨论结构变量在Microsoft编译器中的对齐方式
1. 如果结构成员的第一个地址是其最宽的基本类型成员的整数倍. 当编译器为结构分配内存时,它首先找到最宽的基本成员,然后在内存中查找地址,并使用此最宽的基本数据类型的大小作为对齐模量
2. 结构中每个成员相对于第一个地址的偏移量是成员大小的整数倍. 如果不满足此要求,则编译器将自动添加字节. 当为结构成员打开内存时计算结构体大小,编译器将首先检查已开发内存的第一地址与结构变量的第一地址之间的偏移量. 如果它是成员体的整数倍,则存储此变量,否则将在该成员和上一个成员之间填充字节以实现整数倍
3. 如果结构占用的总内存大小是最大成员主体大小的整数倍ÿ