[C++]字节对齐与结构体大小28.pdfVIP

  1. 1、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
  2. 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  3. 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  4. 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  5. 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  6. 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  7. 7、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
[C]字节对齐与结构体大小28

[C++]字节对齐与结构体大小 说明: 结构体的sizeof 值,并不是简单的将其中各元素所占字节相加,而是要考虑到存储空间的字节对齐问题。这 些问题在平时编程的时候也确实不怎么用到,但在一些笔试面试题目中出是常常出现,对sizeof 我们将在 另一篇文章中总结,这篇文章我们只总结结构体的sizeof,报着不到黄河心不死的决心,终于完成了总结, 也算是小有收获,拿出来于大家分享,如果有什么错误或者没有理解透的地方还望能得到提点,也不至于 误导他人。 别忘了这里/blog/static/30203796201082494026399/ 一、解释 现代计算机中内存空间都是按照byte 划分的,从理论上讲似乎对任何类型的变量的访问可以从任何地址开 始,但实际情况是在访问特定类型变量的时候经常在特 定的内存地址访问,这就需要各种类型数据按照一 定的规则在空间上排列,而不是顺序的一个接一个的排放,这就是对齐。 各个硬件平台对存储空间的处理上有很大的不同。一些平台对某些特定类型的数据只能从某些特定地址开 始存取。比如有些架构的CPU 在访问 一个没有进行对齐的变量的时候会发生错误,那么在这种架构下编 程必须保证字节对齐.其他平台可能没有这种情况,但是最常见的是如果不按照适合其平台要求对 数据存 放进行对齐,会在存取效率上带来损失。比如有些平台每次读都是从偶地址开始,如果一个int 型(假设为 32 位系统)如果存放在偶地址开始的地方,那 么一个读周期就可以读出这32bit,而如果存放在奇地址开 始的地方,就需要2 个读周期,并对两次读出的结果的高低字节进行拼凑才能得到该32bit 数据。 二、准则 其实字节对齐的细节和具体编译器实现相关,但一般而言,满足三个准则: 1. 结构体变量的首地址能够被其最宽基本类型成员的大小所整除; 2. 结构体每个成员相对于结构体首地址的偏移量都是成员大小的整数倍,如有需要编译器会在成员之间加 上填充字节; 3. 结构体的总大小为结构体最宽基本类型成员大小的整数倍,如有需要编译器会在最末一个成员之后加上 填充字节。 三、基本概念 字节对齐:计算机存储系统中以Byte 为单位存储数据,不同数据类型所占的空间不同,如:整型(int)数 据占4 个字节,字符型(char )数据占一个字节,短整型(short)数据占两个字节,等等。计算机为了快 速的读写数据,默认情况下将数据存放在某个地址的起始位置,如:整型数据(int)默认存储在地址能被 4 整除的起始位置,字符型数据(char )可以存放在任何地址位置(被1 整除),短整型(short)数据存储 在地址能被2 整除的起始位置。这就是默认字节对齐方式。 四、结构体长度求法 1.成员都相同时(或含数组且数组数据类型同结构体其他成员数据类型): 结构体长度=成员数据类型长度×成员个数(各成员长度之和); 结构体中数组长度=数组数据类型长度×数组元素个数; 2.成员不同且不含其它结构体时; (1).分析各个成员长度; (2).找出最大长度的成员长度M (结构体的长度一定是该成员的整数倍); (3).并按最大成员长度出现的位置将结构体分为若干部分; (4).各个部分长度一次相加,求出大于该和的最小M 的整数倍即为该部分长度 (5).将各个部分长度相加之和即为结构体长度 3.含有其他结构体时: (1).分析各个成员长度; (2).对是结构体的成员,其长度按b 来分析,且不会随着位置的变化而变化; (3).分析各个成员的长度(成员为结构体的分析其成员长度),求出最大值; (4).若长度最大成员在为结构体的成员中,则按结构体成员为分界点分界; 其他成员中有最大长度的成员,则该成员为分界点; 求出各段长度,求出大于该和的最小M 的整数倍即为该部分长度 (5).将各个部分长度相加之和即为结构体长度 五、空结构体 struct S5 { }; sizeof( S5 ); // 结果为1 “空结构体” (不含数据成员)的大小不为0 ,而是 1。试想一个“不占空间”的变量如何被取地址、两个不同 的“空结构体”变量又如何得以区分呢于是,“空结构体”变量也得被存储,这样编译器也就只能为其分配一个 字节的空间用于占位了。 六、有static 的结构体 struct S4{ char a; long b; static long c; //静态 }; 静态变量存放在全局数据区内,而sizeof 计算栈中分配的空间的大小,故不计算在内,S4 的大小为4+4=8 。 七、举例说明 1.举例 1 很显然默认对齐方式会浪费很多空间,例如如下结构:

文档评论(0)

mliaojfangwi + 关注
实名认证
文档贡献者

该用户很懒,什么也没介绍

1亿VIP精品文档

相关文档