美文网首页
二 结构体字节对齐

二 结构体字节对齐

作者: Mjs | 来源:发表于2020-09-08 17:59 被阅读0次

    原则

    1.数据成员的对齐规则(以最大的类型字节为单位)。

    结构体(struct)的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员存放在offset为该数据成员大小的整数倍的地方(比如int在32位机为4字节,则要从4的整数倍地址开始存储)

    2.结构体作为成员的对齐规则。

    如果一个结构体B里嵌套另一个结构体A,则结构体A应从offset为A内部最大成员的整数倍的地方开始存储。(struct B里存有struct A,A里有char,int,double等成员,那A应该从8的整数倍开始存储。),结构体A中的成员的对齐规则仍满足原则1、原则2。

    注意:

    1. 结构体A所占的大小为该结构体成员内部最大元素的整数倍,不足补齐。
    2. 不是直接将结构体A的成员直接移动到结构体B中

    3.收尾工作

    结构体的总大小,也就是sizeof的结果,必须是其内部最大成员的整数倍,不足的要补齐。

    代码

    typedef struct{
        char a;
        int b;
        char c;
    }A;
    sizeof(A) = 12
    
    [a, *,*,*]
    [b,b,b,b]
    [c,*,*,*]
    
    typedef struct{
        char a;
        char c;
        int b;
    }A;
    sizeof(A) = 8
    [a, c,*,*]
    [b,b,b,b]
    
    

    接下来我们结构体套结构体

    typedef struct{
        char a;
        double b;
        int c;
    }A;
    
    typedef struct{
        char d;
        double e;
        int f;
        A g;
    }B;
    
    sizeof(B) = 48
    [d,*,*,*,*,*,*,*]
    [e,e,e,e,e,e,e,e]
    [f,f,f,f,*,*,*,*]
    [a,*,*,*,*,*,*,*]
    [b,b,b,b,b,b,b,b]
    [c,c,c,c,*,*,*,*]
    
    typedef struct{
        char a;
        double b;
        int c;
    }A;
    
    typedef struct{
        char d;
        int e;
        int f;
        A g;
    }B;
    
    printf("%lu\n%x,%x,%x,%x,%x,%x",sizeof(b),&b.d,&b.e,&b.f,&b.g.a,&b.g.b,&b.g.c);
    40
    efbff468,efbff46c,efbff470,efbff478,efbff480,efbff48
    [d,*,*,*]
    [e,e,e,e]
    [f,f,f,f]
    [a,*,*,*,*,*,*,*]
    [b,b,b,b,b,b,b,b]
    [c,c,c,c,*,*,*,*]
    

    总结

    结构体套结构体时,会以自己最大的成员变量作为依据,互不干扰

    相关文章

      网友评论

          本文标题:二 结构体字节对齐

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