#Pragma Pack (n) //指定对齐的字节数
...
#pragma pop (pop) //恢复对齐状态,默认4字节对齐
目录
什么是对齐
对齐规则
功能
应用
什么是对齐
现代计算机中内存空间都是按照byte划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开始,但实际情况是在访问特定变量的时候经常在特定的内存地址访问,这就需要各类型数据按照一定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。
对齐规则
结构体中各个成员按照它们被声明的顺序在内存中顺序存储。
- 将结构体内所有数据成员的长度值相加,记为sum_a;
- 将各数据成员内存对齐,按各自对齐模数而填充的字节数累加到和sum_a上,记为sum_b。对齐模数是【该数据成员所占内存】与【#pragma pack指定的数值】中的较小者。
- 将和sum_b向结构体模数对齐,该模数是【#pragma pack指定的数值】、【未指定#pragma pack时,系统默认的对齐模数8字节】和【结构体内部最大的基本数据类型成员】长度中数值较小者。结构体的长度应该是该模数的整数倍。
- 静态变量的存放位置与结构体实例的存储地址无关,是单独存放在静态数据区的,因此用siezof计算其大小时没有将静态成员所占的空间计算进来。这一点对类和结构体都适用。
- 普通函数:不占用内存;虚函数:要占用4个字节,用来指定虚函数的虚拟函数表的入口地址。子类与父类共享虚函数入口地址。
设想
不同平台在内存处理和读取顺序上不一致,不对这种情况作出预防措施,可能会失存取效率。这也是时间空间复杂度方面的习惯把握。
假设存在平台读取数据起点为奇/偶地址,可能会多余一个时间周期,并且增加高低地址拼接操作。
应用
在结构体前加上#Pragma Pack(1)
,以一个字节对齐,使用完后要加#pragma pack()
,释放内存对齐。
打比方,现在是windows10 x64的机器,理论上结构体占据空间30字节,打印结果为40。
而当声明了1字节对齐后
所有示例可在git仓库内下载,learnProject/csdnExample at main · 1900Linz/learnProject · GitHub