c语言字节对齐__align()讲解

c语言字节对齐__align()讲解

ID:9212857

大小:248.59 KB

页数:10页

时间:2018-04-22

c语言字节对齐__align()讲解_第1页
c语言字节对齐__align()讲解_第2页
c语言字节对齐__align()讲解_第3页
c语言字节对齐__align()讲解_第4页
c语言字节对齐__align()讲解_第5页
资源描述:

《c语言字节对齐__align()讲解》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库

1、转载自:http://blog.csdn.net/21aspnet/article/details/6729724#comments,方便大家参考学习C语言字节对齐分类:C基础2011-08-2916:0624952人阅读评论(50)收藏举报c语言struct编译器数据结构alignment文章最后本人做了一幅图,一看就明白了,这个问题网上讲的不少,但是都没有把问题说透。一、概念对齐跟数据在内存中的位置有关。如果一个变量的内存地址正好位于它长度的整数倍,他就被称做自然对齐。比如在32位cpu下,

2、假设一个整型变量的地址为0x00000004,那它就是自然对齐的。二、为什么要字节对齐需要字节对齐的根本原因在于CPU访问数据的效率问题。假设上面整型变量的地址不是自然对齐,比如为0x00000002,则CPU如果取它的值的话需要访问两次内存,第一次取从0x00000002-0x00000003的一个short,第二次取从0x00000004-0x00000005的一个short然后组合得到所要的数据,如果变量在0x00000003地址上的话则要访问三次内存,第一次为char,第二次为short

3、,第三次为char,然后组合得到整型数据。而如果变量在自然对齐位置上,则只要一次就可以取出数据。一些系统对对齐要求非常严格,比如sparc系统,如果取未对齐的数据会发生错误,举个例:charch[8];char*p=&ch[1];inti=*(int*)p;运行时会报segmenterror,而在x86上就不会出现错误,只是效率下降。三、正确处理字节对齐对于标准数据类型,它的地址只要是它的长度的整数倍就行了,而非标准数据类型按下面的原则对齐:数组:按照基本数据类型对齐,第一个对齐了后面的自然也就

4、对齐了。联合:按其包含的长度最大的数据类型对齐。结构体:结构体中每个数据类型都要对齐。比如有如下一个结构体:structstu{charsex;intlength;charname[10];};structstumy_stu;由于在x86下,GCC默认按4字节对齐,它会在sex后面跟name后面分别填充三个和两个字节使length和整个结构体对齐。于是我们sizeof(my_stu)会得到长度为20,而不是15.四、__attribute__选项我们可以按照自己设定的对齐大小来编译程序,GNU使

5、用__attribute__选项来设置,比如我们想让刚才的结构按一字节对齐,我们可以这样定义结构体structstu{charsex;intlength;charname[10];}__attribute__((aligned(1)));structstumy_stu;则sizeof(my_stu)可以得到大小为15。上面的定义等同于structstu{charsex;intlength;charname[10];}__attribute__((packed));structstumy_stu;

6、__attribute__((packed))得变量或者结构体成员使用最小的对齐方式,即对变量是一字节对齐,对域(field)是位对齐.五、什么时候需要设置对齐在设计不同CPU下的通信协议时,或者编写硬件驱动程序时寄存器的结构这两个地方都需要按一字节对齐。即使看起来本来就自然对齐的也要使其对齐,以免不同的编译器生成的代码不一样.一、快速理解1.什么是字节对齐?在C语言中,结构是一种复合数据类型,其构成元素既可以是基本数据类型(如int、long、float等)的变量,也可以是一些复合数据类型(如

7、数组、结构、联合等)的数据单元。在结构中,编译器为结构的每个成员按其自然边界(alignment)分配空间。各个成员按照它们被声明的顺序在内存中顺序存储,第一个成员的地址和整个结构的地址相同。为了使CPU能够对变量进行快速的访问,变量的起始地址应该具有某些特性,即所谓的”对齐”.比如4字节的int型,其起始地址应该位于4字节的边界上,即起始地址能够被4整除.2.字节对齐有什么作用?字节对齐的作用不仅是便于cpu快速访问,同时合理的利用字节对齐可以有效地节省存储空间。对于32位机来说,4字节对齐能

8、够使cpu访问速度提高,比如说一个long类型的变量,如果跨越了4字节边界存储,那么cpu要读取两次,这样效率就低了。但是在32位机中使用1字节或者2字节对齐,反而会使变量访问速度降低。所以这要考虑处理器类型,另外还得考虑编译器的类型。在vc中默认是4字节对齐的,GNUgcc也是默认4字节对齐。3.更改C编译器的缺省字节对齐方式在缺省情况下,C编译器为每一个变量或是数据单元按其自然对界条件分配空间。一般地,可以通过下面的方法来改变缺省的对界条件:·使用伪指令#pragmapack(n),C编译器

当前文档最多预览五页,下载文档查看全文

此文档下载收益归作者所有

当前文档最多预览五页,下载文档查看全文
温馨提示:
1. 部分包含数学公式或PPT动画的文件,查看预览时可能会显示错乱或异常,文件下载后无此问题,请放心下载。
2. 本文档由用户上传,版权归属用户,天天文库负责整理代发布。如果您对本文档版权有争议请及时联系客服。
3. 下载前请仔细阅读文档内容,确认文档内容符合您的需求后进行下载,若出现内容与标题不符可向本站投诉处理。
4. 下载文档时可能由于网络波动等原因无法下载或下载错误,付费完成后未能成功下载的用户请联系客服处理。