美文网首页
php7 源码分析-准备(struct and union)

php7 源码分析-准备(struct and union)

作者: 拉风的老衲 | 来源:发表于2019-04-23 10:53 被阅读0次

    结构体是使用struct定义的结构

    struct test{
        char  a;//1
        int   b;//4
        long  c;//8
        void* d;//8
        int   e;//4
        char* f;//8
    }
    

    在代码中标记了每个成员的大小,那么结构体的总大小是1+4+8+8+4+8=33吗?但实际上总大小是40,为什么是40而不是33呢,这里 涉及结构体对齐 的问题,如图1

    图1
    虽然char a只占了1字节,int b只占了4字节,但是long c并不是紧跟着b,而是根据8字节对齐后(大小跟系统有关),c和b之间空了3字节,同样,char*和int 之间也空了4个单位,虽然浪费了7字节,但得益于内存对齐,存取速度会更快,这是结构体对齐的基础。

    接下来讨论一下联合体(union)

    union test{
         char a;//1
         int  b;//4
         long c;//8
    };
    

    那么联合体是怎样的一种格式呢,它复用了同一块内存,如图2


    图2

    从图中可以看出,b和c共用同一块内存,修改a,也会影响b和c的值,同时可以知道联合体的大小为其最大成员的大小为其最大的成员long c的大小8

    相关文章

      网友评论

          本文标题:php7 源码分析-准备(struct and union)

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