一、内存对齐:
编译器将程序(class ,struct,union)中的每个数据(成员变量)安排在适当的位置上。
许多编译器对数据在内存中的存放顺序是有限制的,他们要求这些数据的首地址必须是某个数的整数倍(通常为4/8)
class的大小是其成员变量的和,其成员函数是所有对象共享的,并不占空间
二、为什么要内存对齐?
1.平台原因
不是所有硬件平台都可以访问任意地址上的任意数据,某些平台只能在某些地址处取一些特定的数据,否则会抛出硬件异常
(编址并不是对所有的内存进行编址,所以有些内存不能访问)
2.性能原因:
数据结构应该尽可能的在自然边界对齐,原因是,为了访问未对齐的内存处理器可能需要做俩次内存访问,而对齐的内存只需要访问一次,这样就会提升cpu的访问速率。
内存对齐是以空间换时间的做法
三、内存对齐规则
1.第一个成员在与结构体变量偏移量为0的地址处
2.其他成员变量对齐在对齐数的整数倍的地址处
//对齐数 = min(编译器默认对齐数,该成员的大小)
vs默认对齐数 8
gcc默认对齐数4
3.结构体的总大小为最大对齐数的整数倍
4.结构体如果镶套了结构体,镶套结构体对齐到自己的最大对齐数的整数倍,结构体的总大小是所有最大对齐数的整数倍。
cla