结构体内存对齐即计算结构体的大小
首先,我们需要知道为什么要内存对齐?
1.平台原因:不是所有的硬件平台都能访问任意地址上的任意数据;某些硬件平台只能在某些地址处取某些特定类型的数据,否则抛出异常
2.性能原因:数据结构(尤其是栈)应该尽可能地在自然边界上对齐。原因在于:为了访问未对齐的内存,处理器需要做连词给内存访问;而对球队的内存访问仅需要一次访问。
- 内存对齐是拿空间换时间的做法
- 两种结构体即便内容完全一样,在C编译器看来,是两种类型
怎么计算?(内存对齐规则)
举个栗子:
struct a
{
char c;//1
int x;//4
};
struct b
{
int x;//4
double c;//8
};
int main()
{
printf("struct a:%d\n", sizeof(struct a));//8
printf("struct b:%d\n", sizeof(struct b));//16
system("pause");
return 0;
}
结构体内存对齐规则:
1.第一个成员在与结构体变量偏移量为0的地址处(也就是第一个元素不需要对齐)
2.其他成员变量要对齐到某个数字(对齐数)的整数倍的地址处
3.结构体的总大小为最大对齐数(每个成员变量都有一个对齐数)的整数倍
解释:
- 对齐:放入特定变量的起始偏移量,如果能整除对齐数,则为对齐
- 对齐数是默认自身的大小
- 不对齐调整起始偏移量,保证起始偏移量能整除自身对齐数的最小值