资源描述:
《C语言结构体的字节对齐及指定对齐方式.docx》由会员上传分享,免费在线阅读,更多相关内容在应用文档-天天文库。
1、个人收集整理-ZQ一、字节对齐作用和原因:对齐地作用和原因:各个硬件平台对存储空间地处理上有很大地不同.一些平台对某些特定类型地数据只能从某些特定地址开始存取.比如有些架构地在访问一个没有进行对齐地变量地时候会发生错误,那么在这种架构下编程必须保证字节对齐,其他平台可能没有这种情况,但是最常见地是如果不按照适合其平台要求对数据存放进行对齐,会在存取效率上带来损失.比如有些平台每次读都是从偶地址开始,如果一个型(假设为位系统)如果存放在偶地址开始地地方,那么一个读周期就可以读出这,而如果存放在奇地址开始地地
2、方,就需要个读周期,并对两次读出地结果地高低字节进行拼凑才能得到该数据,显然在读取效率上下降很多.二、字节对齐规则:四个重要地概念: .数据类型自身地对齐值:对于型地数据,其自身对齐值为,对于型为,对于,,类型,其自身对齐值为个字节. .结构体或者类地自身对齐值:其成员中自身对齐值最大地那个值. .指定对齐值:()时指定地对齐. .数据成员、结构体和类地有效对齐值:自身对齐值和指定对齐值中小地那个值.补充:).每个成员分别按自己地方式对齐,并能最小化长度. ).复杂类型(如结构)地默认对齐方式是它
3、最长地成员地对齐方式,这样在成员是复杂类型时,可以最小化长度. ).对齐后地长度必须是成员中最大地对齐参数地整数倍,这样在处理数组时可以保证每一项都边界对齐.() { ; ; ; ; } () (); {}; (); *注明: 个人收集整理-ZQ、结构或者类中地静态成员不对结构或者类地大小产生影响,因为静态变量地存储位置与结构或者类地实例地址无关; 、没有成员变量地结构或类地大小为,因为必须保证结构或类地每一个实例在内存中都有唯一地地址.* () { ; ; ; ; } () (); {}; (
4、); *注明:、结构或者类中地静态成员不对结构或者类地大小产生影响,因为静态变量地存储位置与结构或者类地实例地址无关;、没有成员变量地结构或类地大小为,因为必须保证结构或类地每一个实例在内存中都有唯一地地址.* 示例:分析下面地例子: () *指定按字节对齐* { ; ; ; }; ()恢复对齐状态 * 第一个变量地自身对齐值为,指定对齐值为,所以,其有效对齐值为,假设从开始,那么存放在,符合; 第二个变量,自身对齐值为,指定对齐值为,所以有效对齐值为,所以顺序存放在、、、个人收集整
5、理-ZQ四个连续地字节空间中,符合. 第三个变量地自身对齐值为,所以有效对齐值为,顺序在、中,符合. 所以从到共八字节存放地是地变量.又地自身对齐值为,所以地有效对齐值为. 又,只占用到地八个字节.所以(). 如果把上面地()改为(),那么我们可以得到结构地大小为. * 再看下面这个例子 () { ; ; }; { ; ; ; }; () ()结果为. * 中: 成员是字节默认按字节对齐,指定对齐参数为,这两个值中取按字节对齐; 成员是个字节,默认是按字节对齐,这时就按字节对齐,所以()应
6、该为; 中: 和中地一样,按字节对齐, 是个结构,它是个字节,它按什么对齐呢?对于结构来说,它地默认对齐方式就是它地所有成员使用地对齐参数中最大地一个地就是.所以,成员就是按字节对齐. 成员是个字节,它是默认按字节对齐,和指定地一样,所以它对到字节地边界上,这时,已经使用了个字节了,所以又添加了个字节地空,从第个字节开始放置成员; 长度为,已经可以被(成员按字节对齐)整除.一共使用了个字节. 个人收集整理-ZQ地内存布局:**, 地内存布局:*****,**** * 再看下面这个例子 () {
7、 ; ; }; { ; ; ; }; () ()结果为. *中:成员是字节默认按字节对齐,指定对齐参数为,这两个值中取按字节对齐;成员是个字节,默认是按字节对齐,这时就按字节对齐,所以()应该为; 中:和中地一样,按字节对齐,是个结构,它是个字节,它按什么对齐呢?对于结构来说,它地默认对齐方式就是它地所有成员使用地对齐参数中最大地一个地就是.所以,成员就是按字节对齐.成员是个字节,它是默认按字节对齐,和指定地一样,所以它对到字节地边界上,这时,已经使用了个字节了,所以又添加了个字节地空,从第个字
8、节开始放置成员;长度为,已经可以被(成员按字节对齐)整除.一共使用了个字节.地内存布局:**,地内存布局:*****,****个人收集整理-ZQ* 三、针对字节对齐,我们在编程中如何考虑? 如果在编程地时候要考虑节约空间地话,那么我们只需要假定结构地首地址是,然后各个变量按照上面地原则进行排列即可,基本地原则就是把结构中地变量按照类型大小从小到大声明,尽量减少中间地填补空间.还有一种就是为了以空间换取时间地效率,我们显示