C语言中结构体对齐.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语言中结构体对齐,c语言结构体对齐,c语言结构体内存对齐,c语言结构体字节对齐,c语言中的结构体,c语言中结构体的使用,c语言中结构体,c语言中结构体的定义,c语言中结构体定义,c语言结构体

C 语言中结构体对齐(来自网络) C 语言结构体对齐也是老生常谈的话题了。基本上是面试题的必考题。内容虽然很基础,但一不小心 就会弄错。写出一个struct,然后sizeof ,你会不会经常对结果感到奇怪?sizeof 的结果往往都比你声明的 变量总长度要大,这是怎么回事呢? 开始学的时候,也被此类问题困扰很久。其实相关的文章很多,感 觉说清楚的不多。结构体到底怎样对齐? 有人给对齐原则做过总结,具体在哪里看到现在已记不起来,这里引用一下前人的经验(在没有 #pragma pack 宏的情况下): 原则 1、数据成员对齐规则:结构(struct 或联合union)的数据成员,第一个数据成员放在offset 为 0 的地方,以后每个数据成员存储的起始位置要从该成员大小的整数倍开始(比如 int 在 32 位机为4字节,则要从4 的整数倍地址开始存储)。 原则 2、结构体作为成员:如果一个结构里有某些结构体成员,则结构体成员要从其内部最大 元素大小的整数倍地址开始存储。(struct a 里存有struct b,b 里有 char,int,double 等元素, 那b 应该从 8 的整数倍开始存储。) 原则 3、收尾工作:结构体的总大小,也就是sizeof 的结果,必须是其内部最大成员的整数倍, 不足的要补齐。 这三个原则具体怎样理解呢?我们看下面几个例子,通过实例来加深理解。 例 1:struct { short a1; short a2; short a3; }A; struct{ long a1; short a2; }B; sizeof(A) = 6; 这个很好理解,三个short 都为2 。 sizeof(B) = 8; 这个比是不是比预想的大2 个字节?long 为4 ,short 为2 ,整个为8,因为原则3 。 例2 :struct A{ int a; char b; short c; }; struct B{ char b; int a; short c; }; sizeof(A) = 8; int 为4 ,char 为 1,short 为2 ,这里用到了原则1 和原则3 。 sizeof(B) = 12; 是否超出预想范围?char 为 1,int 为4 ,short 为2 ,怎么会是12?还是原则1 和原则3 。 深究一下,为什么是这样,我们可以看看内存里的布局情况。 a b c A 的内存布局:1111, 1*, 11 (其中星号*表示填充的字节。) b a c B 的内存布局:1***, 1111, 11** A 中,b 后面为何要补充一个字节?因为c 为short,其起始位置要为2 的倍数,就是原则1。c 的后面 没有补充,因为b 和c 正好占用4 个字节,整个A 占用空间为4 的倍数,也就是最大成员int 类型的倍数, 所以不用补充。 B 中,b 是char 为 1,b

文档评论(0)

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

1亿VIP精品文档

相关文档