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

结构体是使用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

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • 专业考题类型管理运行工作负责人一般作业考题内容选项A选项B选项C选项D选项E选项F正确答案 变电单选GYSZ本规程...
    小白兔去钓鱼阅读 9,070评论 0 13
  • 如果需要原文档(因文体限制,部分表格无法呈现)请联系QQ1769090563 本文由中医仲景协会整理收集 《内经选...
    陶墨阅读 34,852评论 0 33
  • 今年我已经22岁了,我还没有毕业还有一个多月,在这个快要到过年的时候。不知道为什么心里有着一丝丝的伤感。我还不...
    海辉HH阅读 1,536评论 0 0
  • 我有一个穷爸爸,穷爸爸有个朋友,我称呼他为“富爸爸”。我好奇,富爸爸和穷爸爸明明是一起开始的北漂生活,但20多年后...
    嘿我是侠侠阅读 659评论 2 3
  • 编辑/方禾 修己,以清心为要。 涉世,以慎言为先。 律己,宜带秋气。处世,须带春风。 心术,以光明笃实为第一。容貌...
    东十八月阅读 518评论 0 1