1.内存对齐是什么?

对结构体和类来说,让变量不是紧挨着存放,而是通过变量字节倍数的形式存放

2.为什么会有内存对齐?

3.内存对齐规则

4.案例

运行环境:Microsoft Visual Studio Community 2022 (64 位) - Current版本 17.3.4
对齐模数:#pragma pack(show) == 16 内存对齐

pack == 16
struct A{
	char a;	//0-3
	int b;	//4-7
	double c;//8-15	
};  //	16/8 可除
规则1:需要按照min(pack,sizeof(变量本身))的倍数进行选择开始位置
规则2:整体按照min(pack,sizeof(字节数最大的变量))的倍数进行计算
pack == 2
struct B{
	char a;	//0-2
	int b;	//2-5
	double c;//6-13
};  //	14/2 可除
规则1:需要按照min(pack,sizeof(变量本身))的倍数进行选择开始位置
规则2:整体按照min(pack,sizeof(字节数最大的变量))的倍数进行计算
pack == 16
struct C{
	char a;	//0-1
    short b[3];//2-7 --->the place
	int c;	//8-15
	double d;//16-23	
};  //	24/8 可除
规则3:数组则按照本身是哪种类型变量进行计算,同样遵循规则
pack == 16
struct D{
	char a;	//0-7
    struct C b;//8-31
	int c;	//32-39
	double d;//40-47
};  //	48/8 可除
规则4:结构体中的结构体X,X内部遵循规则1计算大小,并且选择位置也遵循规则1
pack == 2
struct D{
	char a;	//0-1
    struct B b;//2-15
	int c;	//16-19
	double d;//20-7
};  //	28/2 可除
规则4:结构体中的结构体X,X内部遵循规则1计算大小,并且选择位置也遵循规则1

5.其他的注意

6.类与内存对齐

待补充链接

参考

参考资料:浅谈CPU内存访问要求对齐的原因 – 仰望苍天思寰宇 (yangwang.hk)

发表回复