美文网首页
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