第一章 C语言字节对齐__align()讲解.pdfVIP

  1. 1、本文档共10页,可阅读全部内容。
  2. 2、原创力文档(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。
  3. 3、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载
  4. 4、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
  5. 5、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
  6. 6、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们
  7. 7、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
  8. 8、VIP文档为合作方或网友上传,每下载1次, 网站将根据用户上传文档的质量评分、类型等,对文档贡献者给予高额补贴、流量扶持。如果你也想贡献VIP文档。上传文档
查看更多
转载自:/21aspnet/article/details/6729724#comments ,方便大家参考学习 C语言字节对齐 C CC 分类: C基础2011-08-29 16:0624952人阅读评论(50)收藏举报 c 语言struct编译器数据结构alignment 文章最后本人做了一幅图,一看就明白了,这个问题网上讲的不少,但是都没有把问题说透。 一、概念 对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍, 他就被称做自然对齐。比如在32位cpu 下,假设一个整型变量的地址为0那它 就是自然对齐的。 二、为什么要字节对齐 需要字节对齐的根本原因在于CPU 访问数据的效率问题。假设上面整型变量的地址 不是自然对齐,比如为0则CPU 如果取它的值的话需要访问两次内存,第一 次取从00一个short,第二次取从00一 个short然后组合得到所要的数据,如果变量在0址上的话则要访问三次内存, 第一次为char,第二次为short,第三次为char,然后组合得到整型数据。而如果变量在自 然对齐位置上,则只要一次就可以取出数据。一些系统对对齐要求非常严格,比如sparc 系统,如果取未对齐的数据会发生错误,举个例: char ch[8]; char *p = ch[1]; int i = *(int *)p; 运行时会报segment error,而在x86上就不会出现错误,只是效率下降。 三、正确处理字节对齐 对于标准数据类型,它的地址只要是它的长度的整数倍就行了,而非标准数据类型按 下面的原则对齐: 数组 :按照基本数据类型对齐,第一个对齐了后面的自然也就对齐了。 联合 :按其包含的长度最大的数据类型对齐。 结构体: 结构体中每个数据类型都要对齐。 比如有如下一个结构体: struct stu{ char sex; int length; char name[10]; }; struct stu my_stu; 由于在x86下,GCC默认按4字节对齐,它会在sex 后面跟name后面分别填充三个和 两个字节使length 和整个结构体对齐。于是我们sizeof(my_stu)会得到长度为20,而不是 15. 四、__attribute__选项 我们可以按照自己设定的对齐大小来编译程序,GNU使用__attribute__选项来设置, 比如我们想让刚才的结构按一字节对齐,我们可以这样定义结构体 struct stu{ char sex; int length; char name[10]; }__attribute__ ((aligned (1))); struct stu my_stu; 则sizeof(my_stu)可以得到大小为15。 上面的定义等同于 struct stu{ char sex; int length; char name[10]; }__attribute__ ((packed)); struct stu my_stu; __attribute__((packed))得变量或者结构体成员使用最小的对齐方式,即对变量是一字 节对齐,对域(field)是位对齐. 五、什么时候需要设置对齐 在设计不同CPU 下的通信协议时,或者编写硬件驱动程序时寄存器的结构这两个地 方都需要按一字节对齐。即使看起来本来就自然对齐的也要使其对齐,以免不同的编译器生 成的代码不一样. 一、快速理解 1. 什么是字节对齐? 在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、 float等)的变量,也可以是一些复合数据类型(如数组、结构、联合等)的数据单元。在 结构中,编译器为结构的每个成员按其自然边界(alignment)分配空间。各个成员按照它 们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。 为了使CPU能够对变量进行快速的访问,变量的起始地址应该具

文档评论(0)

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

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

1亿VIP精品文档

相关文档