字节对齐是C/C++编译器为了加速CPU寻址速度而采用的一种策略,通常的表现是将结构中某些不足CPU字长的成员填入若干字节的垃圾值使整个结构的大小成为CPU字长的整数倍。一个CPU的字长,通常简单地理解为一个sizeof(int)的大小。
字节对齐的规律是:
假设结构体的其实地址为0, N字节对齐
1)结构体成员变量地址是min(变量类型大小,N)的整数倍,否则补齐。
2)结构体的长度为结构体中所有对齐参数的整数倍,否则补齐。
举例说明:
#include "stdio.h"
#pragma pack(4)
#pragma pack(push)
#pragma pack(4)
struct{
short a1; //2
short a2; //2
char a3; //1
}A; //5+1
struct{
short a1; //2
char a2; //1+1
short a3; //2
}B; //6
struct{
long a1; //4
short a2; //2
}C; //6+2
struct{
short a1; //2+2
long a2; //4
short a3; //2
}D; //10+2
struct{
char a1; //1
char a3; //1
}E; //2
#pragma pack(pop)
void main(void)
{
int num;
num = sizeof(A);
num = sizeof(B);
num = sizeof(C);
num = sizeof(D);
num = sizeof(E);
}