1、什么叫数据的内存对齐?
所谓数据对齐,就是指存放数据的内存地址必须是“对齐单位”的整数倍,这样做是为了提高处理器的访问速度;
2、对齐单位怎么确定?
不同的平台都有一个默认的对齐单位,一般来说32位平台的默认对齐单位为4字节,64位平台的默认对齐单位为8字节,可以使用语句:#pragma pack(k)将平台的默认对齐单位设为k,同时也可以用#pragma pack()(即不加参数)将对齐单位设回默认值。对齐单位的选取还和数据的长度有关:
2.1、单个数据的对齐:
单个数据的对齐单位为数据长度和默认对齐单位的较小值:若默认对齐长度为4,一个short型数据的对齐单位为:min(4,sizeof(short)),即为2;一个double型数据的对其单位为:min(4,sizeof(double)),即为4;
单个数据占用内存大小:该数据类型的长度。
2.2、结构型数据的对齐:
结构型数据的对齐单位是结构中最长元素的长度和默认对齐单位的较小值,即min(默认, max(L(1), L(2), ... , L(N) )),L(i)为结构数据中每个元素的长度:如:
struct
{
char a;
int b;
double c;
}
若默认对齐单位为4,则对其单位为:min(4,sizeof(double)),即为4;
结构数据是如何存放的:
(1)单个元素对齐:首先,C++实现(如VS)会计算所需要的该结构数据的对齐单位大小,结构数据的首地址为能够被此对齐单位整除的内存地址,以这个首地址为基地址存放结构数据。由于此基地址能被结构数据的对齐单位整除,则肯定能被第一个元素的对齐单位整除。因此,在offset为0处放置结构中的第一个元素,以上述结构体为例,a存放在offset为0的位置;第二个元素的首地址要能被该元素的对齐单位整除,b的对齐单位是min(4,sizeof(int)) = 4,因此在a的位置后空三个字节,将b放在offset为4的位置;c的对齐单位也为4,因此可紧接着b放置;
(2)整体对齐:经过上述的元素放置,还不能确定结构数据占用的内存大小,还需要对整个结构元素进行对其,即该结构元素的长度必须要是它的对齐单位的整数倍,上述例子中经过单个元素对齐占用的内存为16字节,结构的对齐单位是4字节,满足条件;若该结构还有一个元素:char d,那么单个元素对齐后占用了17个字节,由于不能被4整除,因此要补齐三字节,实际占用的字节数为20字节。