C++ 内存对齐
作用范围为 struct / union
一、内存对齐的规则:
1、 对于结构的各个成员,第一个成员位于偏移为0的位置,以后每个数据成员的偏移量必须是min(#pragma pack()指定的数,这个数据成员的自身长度) 的倍数。
2、 在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行对齐。
二、
可以通过 #pragma pack(n)设置为n字节对齐 其中n 为1 2 4 8 16 。。
通过#pragma pack(show) 获得当前对齐字节
三、例子
struct testS
{
char b;
int c;
double d;
};
在给char b申请内存时偏移量为0,是sizeof(char)的倍数直接分配。
在给int c申请内存时偏移量为1,不是sizeof(int)的倍数所以要填充3个字节让偏移量达到4成为sizeof(int)的倍数然后为其分配内存。
在给double d申请内存时偏移量为8时sizeof(double)的倍数,直接分配。
所以最后sizeof(testS)的结果是16
struct testS
{
int c;
char b;
};
在testS中按照上面描述的方法进行分配内存。
分配int c时偏移量为0直接分配
分配char b时偏移量为4直接分配
但是sizeof(testS)不是5,这满足规则第二条。这只是完成了数据成员的内存对齐,还没有做结构本身的内存对齐。按照结构本身的对齐规则来说,我们要取出所有成员和#pragma pack指定的数值中较小的一个得倍数来对齐结构。所以sizeof(testS)的结果是8。
struct testS{
short c;
char b;
};
sizeof(testS)则为4.