结构体字节对齐
在定义结构体时,会发现结构体的大小有时是成员的字节大小相加,有时候又比成员的字节数相加大。这就涉及字节对齐问题。在访问内存时,是以4个字节或8个字节一次访问的,这样访问效率高。在结构体时会出现其他的数据大小,这时就要字节对齐,浪费一些空间,凑成4或8的整数倍。
程序解释
struct p1
{
char c;
}p1;
struct p2
{
}p2;
struct p3
{
char c;
int age;
}p3;
struct p4
{
char c;
int age;
double score;
}p4;
int main(void)
{
printf("char\tshort\tint\tfloat\tdouble\t\n");
printf("%d\t%d\t%d\t%d\t%d\t\n",sizeof(char),
sizeof(short),sizeof(int),sizeof(float),
sizeof(double));
//sizeof(student);
printf("p1: %d\n",sizeof(p1));
printf("p2: %d\n",sizeof(p2));
printf("p3: %d\n",sizeof(p3));
printf("p4: %d\n",sizeof(p4));
return 0;
}
结果
//32位平台结果
char short int float double
1 2 4 4 8
p1: 1
p2: 0
p3: 8
p4: 16
可以看到空结构体的大小为0,单个成员的结构体大小为本身字节大小。多个成员的字节大小需要分析。结构体中的大小为成员里面的字节数最大的整数倍,p3中,int类型最大,p3结构体大小为8。p4中,double最大,p4结构体大小为16。
结构体优化
struct student1
{
int age;
double score;
char name[20];
}student1;
struct student2
{
int age;
//注意位置调换
char name[20];
double score;
}student2;
int main(void)
{
printf("char\tshort\tint\tfloat\tdouble\t\n");
printf("%d\t%d\t%d\t%d\t%d\t\n",sizeof(char),
sizeof(short),sizeof(int),sizeof(float),
sizeof(double));
printf("student1: %d\n",sizeof(student1));
printf("student2: %d\n",sizeof(student2));
return 0;
}
结果
char short int float double
1 2 4 4 8
student1: 40
student2: 32
可以看到,同样的成员,但是位置不同,造成占用的的内存不一样。知道字节对齐后,可以通过调整成员顺序来优化内存。