系统需要某些基元存储器(整数到是4的倍数,短裤是2的倍数字节等字节)内对准到特定点。 当然,这些可以被优化以在浪费填充最小的空间。
我的问题是,为什么不GCC自动做到这一点? 是比较明显的启发式(顺序变量从最大尺寸要求到最小)缺乏某种方式? 是一些代码依赖于它的结构的物理顺序(是个好主意)?
我只问,因为GCC在很多方面超优化,但不是在这一个,和我想肯定会有一些比较酷的解释(到我忘却)。
系统需要某些基元存储器(整数到是4的倍数,短裤是2的倍数字节等字节)内对准到特定点。 当然,这些可以被优化以在浪费填充最小的空间。
我的问题是,为什么不GCC自动做到这一点? 是比较明显的启发式(顺序变量从最大尺寸要求到最小)缺乏某种方式? 是一些代码依赖于它的结构的物理顺序(是个好主意)?
我只问,因为GCC在很多方面超优化,但不是在这一个,和我想肯定会有一些比较酷的解释(到我忘却)。
GCC不重新排列结构的元素,因为这将违反C标准。 第C99标准状态6.7.2.1:
内的结构对象,非比特音响场构件和单元,其中比特音响视场驻留具有在其声明的顺序增加的地址。
经常使用结构为二进制文件格式和网络协议的打包顺序的表示。 如果是这样做会打破。 此外,不同的编译器将不同的优化的东西,从两者一起链接码是不可能的。 这根本是不可行的。
GCC是生产从我们的源代码的机器代码比我们更聪明的; 不过,我颤抖,如果它比我们聪颖重新安排我们的结构,因为它是,例如可以写入到文件中的数据。 与4个字符开始,然后的struct如果另一个系统中GCC决定,它应该重新安排结构成员上读取4个字节的整数将是无用的。
GCC SVN确实有一个结构重组优化(-fipa - 结构 - REORG),但它需要整个程序分析,是不是很厉害的时刻。
C编译器像你提到不会自动包装结构, 正是因为对齐问题。 访问未在字边界(在大多数CPU的32位)进行86重罚,并导致对RISC架构致命的陷阱。
并不是说这是一个好主意,但你肯定可以编写依赖于一个结构的成员的顺序码。 例如,作为一个黑客,人们往往投一个指向结构作为某一个领域的类型里面,他们希望获得,然后使用指针运算到那里。 对我来说,这是一个相当危险的想法,但我已经看到了使用,特别是在C ++强制一个已经声明为private的变量是当它从第三方库类,并没有公开封装可公开访问的。 重新排列成员将完全打破。
你可能想尝试最新的gcc主干或结构-REORG-分支,它正在积极发展。
https://gcc.gnu.org/wiki/cauldron2015?action=AttachFile&do=view&target=Olga+Golovanevsky_+Memory+Layout+Optimizations+of+Structures+and+Objects.pdf