字节对齐
我想请教关于字节对齐的问题。我在网上找到如下的资料:
字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则:
1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
2) 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节;例如上面第二个结构体变量的地址空间。
3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节。例如上面第一个结构体变量。
程序如下:
#include <stdio.h>
#pragma pack(4)//按4字节对齐
typedef struct T1_Tag
{
char x1;
short x2;
double x3;
char x4;
} T1;
int main()
{
T1 t1;
printf("sizeof(T1)=%d\n",sizeof(t1));
}
结果是16,这我不明白。我认为下x1占4B,x2占4B,x3占8B,x4占4B才对啊。
如果我按2字节对齐,
#include <stdio.h>
#pragma pack(2)
typedef struct T1_Tag
{
char x1;
short x2;
double x3;
char x4;
} T1;
int main()
{
T1 t1;
printf("sizeof(T1)=%d\n",sizeof(t1));
}
结果就成了14,按上述原则,结构体的总大小为结构体最宽基本类型成员大小的整数倍,最宽是double,应该是8的整数倍啊。我真的不明白,望指教!!!!