#include<stdio.h>
struct A
{
char name;
double age;
char sex;
};
struct B
{
char name;
char sex;
double age;
};
int main(int argc, char *argv[]) {
printf("char->%d\n", sizeof(char));
printf("double->%d\n", sizeof(double));
printf("A->%d\n", sizeof(struct A));
printf("B->%d\n", sizeof(struct B));
return 0;
}
char->1
double->8
A->24
B->16
为什么A和B的sizeof值不一样,明明都是两个char和一个double,不应该是1+1+8 = 10嘛?
#include<stdio.h>
struct A
{
char name;
double age;
char sex;
} a;
struct B
{
char name;
char sex;
double age;
} b;
int main(int argc, char *argv[]) {
printf("a.name->%d\n", &a.name);
printf("a.age->%d\n", &a.age);
printf("a.sex->%d\n", &a.sex);
printf("A->%d\n", sizeof(struct A));
printf("b.name->%d\n", &b.name);
printf("b.sex->%d\n", &b.sex);
printf("b.age->%d\n", &b.age);
printf("B->%d\n", sizeof(struct B));
return 0;
}
a.name->170442768
a.age->170442776
a.sex->170442784
A->24
b.name->170442792
b.sex->170442793
b.age->170442800
B->16
我们已经可以从图中看出两个结构体在内存的存放格式了。
要看数据总线是多少位,如果是32位,则可以读取4个字节,如果是64位,则可以读取8个字节,并且cpu不能跨内存区间访问。
结构体对齐的好处就是一次cpu的读取数据就可以完成一个变量的读取。
上述结构体A如果按照下面这样子对齐,我的电脑还是64位,这样子你会发现age这个double的变量(绿色部分)需要cpu读取两次才能完成读取。这样子不就是浪费时间了吗,所以结构体对齐就是一种空间换时间的方式。
以后写结构体一定注意结构体对齐问题,结构体会因为成员不同的排列顺序,产生不同大小的内存占用。