- 1、有哪些信誉好的足球投注网站(book118)网站文档一经付费(服务费),不意味着购买了该文档的版权,仅供个人/单位学习、研究之用,不得用于商业用途,未经授权,严禁复制、发行、汇编、翻译或者网络传播等,侵权必究。。
- 2、本站所有内容均由合作方或网友上传,本站不对文档的完整性、权威性及其观点立场正确性做任何保证或承诺!文档内容仅供研究参考,付费前请自行鉴别。如您付费,意味着您自己接受本站规则且自行承担风险,本站不退款、不进行额外附加服务;查看《如何避免下载的几个坑》。如果您已付费下载过本站文档,您可以点击 这里二次下载。
- 3、如文档侵犯商业秘密、侵犯著作权、侵犯人身权等,请点击“版权申诉”(推荐),也可以打举报电话:400-050-0827(电话支持时间:9:00-18:30)。
- 4、该文档为VIP文档,如果想要下载,成为VIP会员后,下载免费。
- 5、成为VIP后,下载本文档将扣除1次下载权益。下载后,不支持退款、换文档。如有疑问请联系我们。
- 6、成为VIP后,您将拥有八大权益,权益包括:VIP文档下载权益、阅读免打扰、文档格式转换、高级专利检索、专属身份标志、高级客服、多端互通、版权登记。
- 7、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能够对变量进行快速的访问,变量的起始地址应该具
您可能关注的文档
最近下载
- 2025年中国邮政集团有限公司吉林省分公司校园招聘笔试模拟试题及完整答案详解.docx VIP
- 2024年《汽轮机本体检修》职业技能鉴定知识考试必备题库及答案(共190题).docx VIP
- (名师原创)《我能行》主题班会.ppt VIP
- 2022年初中物理培优(竞赛)及高中自主招生专题训练:第02章声现象(含解析).pdf VIP
- 三式簿记和收益动量 (美)伊尻雄治著娄尔行译.pdf VIP
- 华荣QJZ-2×□SF煤矿风机用隔爆兼本质安全型双电源真空电磁起动器.doc
- 《嗨,你好》幼儿园小班课程PPT课件.pptx VIP
- 2025年中国邮政集团有限公司吉林省分公司校园招聘笔试模拟试题及答案解析.docx VIP
- 可穿戴设备在睡眠数据采集中的应用.pptx VIP
- AI人工智能软件使用课件.pptx VIP
文档评论(0)