在有的编译器中,sizeof得到的结构体内存长度可能比理论值大。例如VC环境下,下面两个结构体类型
struct A {
int a;//4字节
char b;//1字节
short c; //2字节
}
struct B {
char b; //1字节
int a;//4字节
short c; //2字节
}
成员相同 (仅顺序不同) ,理论上它们的内存长度应是4+1+2=7。但实际上sizeof(struct A)的结果为8,sizeof(struct B)的结果为12。
为了加快数据存取的速度,编译器默认情况下会对结构体成员和结构体本身(实际上其他数据对象也是如此) 存储位置进行处理,使其存放的起始地址是一定字节数的倍数,而不是顺序存放,称为字节对齐。
VC默认的字节对齐数为8
更改为1后,sizeof()结果正常。
#include <stdio.h>
#pragma pack(push)
#pragma pack(1)
struct A {
int a;
char b;
short c;
};
struct B {
char b;
int a;
short c;
};
#pragma pack(pop)
int main()
{
printf("A:%llu ", sizeof(A));
printf("B:%llu", sizeof(B));
return 0;
}
执行结果为:A:7 B:7