[044]C语言基础-结构体对齐
2020-03-23 本文已影响0人
王小二的技术栈
一、什么是结构体对齐?
1.1 废话不多说,先来个代码
#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;
}
1.2 运行结果
char->1
double->8
A->24
B->16
1.3 疑问
为什么A和B的sizeof值不一样,明明都是两个char和一个double,不应该是1+1+8 = 10嘛?
其实就是c语言结构体对齐搞的鬼
二、为什么会这样子?
2.1 修改代码
#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;
}
2.2 运行结果
a.name->170442768
a.age->170442776
a.sex->170442784
A->24
b.name->170442792
b.sex->170442793
b.age->170442800
B->16
2.3 内存示意图
我们已经可以从图中看出两个结构体在内存的存放格式了。
![](https://img.haomeiwen.com/i14919101/0be43799da87fe61.png)
三、结构体对齐的好处
3.1 cpu读取一次能读取多少数据?
要看数据总线是多少位,如果是32位,则可以读取4个字节,如果是64位,则可以读取8个字节,并且cpu不能跨内存区间访问。
3.2 提升读取效率
结构体对齐的好处就是一次cpu的读取数据就可以完成一个变量的读取。
举个例子:
上述结构体A如果按照下面这样子对齐,我的电脑还是64位,这样子你会发现age这个double的变量(绿色部分)需要cpu读取两次才能完成读取。这样子不就是浪费时间了吗,所以结构体对齐就是一种空间换时间的方式。
![](https://img.haomeiwen.com/i14919101/8fd70ee951741b3b.png)
四、总结
以后写结构体一定注意结构体对齐问题,结构体会因为成员不同的排列顺序,产生不同大小的内存占用。