1. 自营销首页
  2. 技术

C语言基础-结构体对齐

一、什么是结构体对齐?

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->1double->8A->24B->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->170442768a.age->170442776a.sex->170442784A->24b.name->170442792b.sex->170442793b.age->170442800B->16

2.3 内存示意图

我们已经可以从图中看出两个结构体在内存的存放格式了。

三、结构体对齐的好处

3.1 cpu读取一次能读取多少数据?

要看数据总线是多少位,如果是32位,则可以读取4个字节,如果是64位,则可以读取8个字节,并且cpu不能跨内存区间访问。

3.2 提升读取效率

结构体对齐的好处就是一次cpu的读取数据就可以完成一个变量的读取。

举个例子:

上述结构体A如果按照下面这样子对齐,我的电脑还是64位,这样子你会发现age这个double的变量(绿色部分)需要cpu读取两次才能完成读取。这样子不就是浪费时间了吗,所以结构体对齐就是一种空间换时间的方式。

四、总结

以后写结构体一定注意结构体对齐问题,结构体会因为成员不同的排列顺序,产生不同大小的内存占用。

版权声明:本文来自用户投稿,不代表本站立场,侵删。转载保留链接:https://www.zyxiao.com/p/17761

发表评论

电子邮件地址不会被公开。 必填项已用*标注

联系我们

186-0773-5935

在线咨询:点击这里给我发消息

邮件:kf@zyxiao.com

工作时间:周一至周五,9:30-18:30,节假日休息