前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >结构体大小的计算

结构体大小的计算

作者头像
编程范 源代码公司
发布2019-11-11 18:24:26
6540
发布2019-11-11 18:24:26
举报

原 则

  • 1) 结构体变量的首地址能够被其最宽基本类型成员的大小所整除;
  • 2) 结构体每个成员相对于结构体首地址的偏移量(offset)都是成员大小的整数倍,如有需要编译器会在成员之间加上填充字节(internal adding);
  • 3) 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上填充字节(trailing padding)

其实暂且不管这三原则,只要记住第三个,就是结构体大小结果要为成员中最大字节的整数倍。

先看下面定义的两个结构体:

分别用程序测试得出:sizeof(S1)=6 , sizeof(S2)=4

【问】仅仅改变了结构体成员的顺序,结果不一样?

解:

  • (1)首先找出成员变量中最大的字节,可见对于 S1 和 S2 最大是 short ,占 2 个字节;
  • (2)所以以后都已2个字节为准,也就是说最多只要2个字节,其他填充占位,注意下图一个格子表示一个字节;
  • (3)所以先画2个格子,以后看成员顺序,逐次增加,每次一2为增加基准

对于 S1 来说,顺序是 char->short->char

所以对于 S1 结构体大小为 2*3=6,至于为什么第二个 char,多的那个字节不丢到,就是遵循第三个原则,就是结构体大小结果要为成员中最大字节的整数倍。

对于 S2 嘛,也画个图,但是顺序是 char->char->short

按照这个方法再看这样的一个结构体:

很明显,最大字节为 4 个。顺序 int char int

因为 int 占 4 个,而 char 已经占了一个,不够,所以那三个只能多余占位。

那么换一下呢?

再看一个:就是当结构体成员变量是另外一个结构体时,只要把结构体中成员为另一结构体作为整体相加就行。

而对于 B,先不要管 A a,也就是先去掉 A a 成员结构体 B 算出其为 8,所以最后结果为 8+16=24;24 才是最后结果。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-11-02,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 编程范 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档