前往小程序,Get更优阅读体验!
立即前往
发布
社区首页 >专栏 >[044]C语言基础-结构体对齐

[044]C语言基础-结构体对齐

作者头像
王小二
发布2020-06-08 12:09:21
发布2020-06-08 12:09:21
70500
代码可运行
举报
运行总次数:0
代码可运行

一、什么是结构体对齐?

1.1 废话不多说,先来个代码

代码语言:javascript
代码运行次数:0
复制
#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 运行结果

代码语言:javascript
代码运行次数:0
复制
char->1
double->8
A->24
B->16

1.3 疑问

为什么A和B的sizeof值不一样,明明都是两个char和一个double,不应该是1+1+8 = 10嘛?

其实就是c语言结构体对齐搞的鬼

二、为什么会这样子?

2.1 修改代码

代码语言:javascript
代码运行次数:0
复制
#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 运行结果

代码语言:javascript
代码运行次数:0
复制
a.name->170442768
a.age->170442776
a.sex->170442784
A->24
b.name->170442792
b.sex->170442793
b.age->170442800
B->16

2.3 内存示意图

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

三、结构体对齐的好处

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

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

3.2 提升读取效率

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

举个例子:

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

四、总结

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

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 一、什么是结构体对齐?
    • 1.1 废话不多说,先来个代码
    • 1.2 运行结果
    • 1.3 疑问
  • 二、为什么会这样子?
    • 2.1 修改代码
    • 2.2 运行结果
    • 2.3 内存示意图
  • 三、结构体对齐的好处
    • 3.1 cpu读取一次能读取多少数据?
    • 3.2 提升读取效率
  • 四、总结
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档