美文网首页
[044]C语言基础-结构体对齐

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

作者: 王小二的技术栈 | 来源:发表于2020-03-23 20:02 被阅读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 内存示意图

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


    三、结构体对齐的好处

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

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

    3.2 提升读取效率

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

    举个例子:

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


    四、总结

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

    相关文章

      网友评论

          本文标题:[044]C语言基础-结构体对齐

          本文链接:https://www.haomeiwen.com/subject/vwcgyhtx.html