码迷,mamicode.com
首页 > 其他好文 > 详细

gcc 数据对齐之:总结篇.

时间:2017-02-13 19:01:37      阅读:200      评论:0      收藏:0      [点我收藏+]

标签:最大数   类型   地方   比较   ons   字节   stack   指针数组   pac   

 通过上面的分析,总结结构体对齐规则如下:

1、数据成员对齐规则:结构(struct)(或联合(union))的数据成员,第一个数据成员放在offset为0的地方,以后每个数据成员的对齐按照#pragma pack指定的数值和这个数据成员自身长度中,比较小的那个进行。
2、结构(或联合)的整体对齐规则:在数据成员完成各自对齐之后,结构(或联合)本身也要进行对齐,对齐将按照#pragma pack指定的数值和结构(或联合)最大数据成员长度中,比较小的那个进行。
3、结合1、2颗推断:当#pragma pack的n值等于或超过所有数据成员长度的时候,这个n值的大小将不产生任何效果。

4. 结构整体长度的计算必须取所用过的所有对齐参数的整数倍,不够补空字节;因为对齐参数都是2的n次方,所以取所用过的所有对齐参数中最大的那个值的最小整数倍即可。

5.具有自对齐类型的平台上,对于char、short、int、long和指针数组都没有内部填充,每个成员都与下一个成员自动对齐。但这种情况对结构体数组并不适用, 结构体数组还是需要根据对齐规则进行对齐的。

6.有时候为了节省结构体所占内存空间,可以按照较大的数据类型(需要更严格的对齐)到较小的数据类型依次排列,即越大的数据类型放在越前面。但这种规则并不是通用的,需要灵活掌握,如结构体中内嵌结构体的时候,需要具体情况具体分析。而且一般是业务相关的数据类型组织在结构体的某一部分。

 

番外篇:

在stackoverflow中,有讨论说,某些低版本的gcc 存在bug,在stack空间中,并不执行 attribute 的 aligned 属性,然后我再实际编码中并未遇到此情况,也没有特意对此问题进行验证,原则是知道此问题即可,真遇到这种问题debug时候在分析,数据对齐篇到此结束。 

stackvoerflow讨论;http://stackoverflow.com/questions/841433/gcc-attribute-alignedx-explanation

 

 

 

gcc 数据对齐之:总结篇.

标签:最大数   类型   地方   比较   ons   字节   stack   指针数组   pac   

原文地址:http://www.cnblogs.com/3me-linux/p/6394689.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!