zoukankan      html  css  js  c++  java
  • gcc 数据对齐之:总结篇.

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

    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

     

  • 相关阅读:
    MyBatis(六)缓存机制 之 缓存的相关属性设置
    MyBatis(六)缓存机制 之 缓存机制简介
    MyBatis(五)动态SQL 之 批量操作(插入)
    MyBatis(五)动态SQL 之 批量操作(删除)
    MyBatis(六)缓存机制 之 整合第三方缓存
    MyBatis(六)缓存机制 之 二级缓存
    MyBatis(五)动态SQL 之 批量操作(查询)
    MyBatis(六)缓存机制 之 缓存原理图
    MyBatis(六)缓存机制 之 一级缓存
    MyBatis(五)动态SQL 之 批量操作(更新)
  • 原文地址:https://www.cnblogs.com/3me-linux/p/6394689.html
Copyright © 2011-2022 走看看