为什么GCC不优化结构?
系统要求某些原语与内存中的某些点alignment(整数字节是4的倍数,短到字节的倍数是2等)。 当然,这些可以优化浪费最less的空间填充。
我的问题是为什么不GCC自动执行此操作? 缺乏某种方式的更明显的启发式(从最大尺寸要求到最小的顺序variables)? 是否一些代码依赖于它的结构的物理顺序(这是一个好主意)?
我只是问,因为海湾合作委员会是在很多方面超级优化,而不是在这一个,我想一定有一些相对较酷的解释(我不知道)。
gcc不重新sorting结构的元素,因为这会违反C标准。 C99标准的6.7.2.1节规定:
在一个结构对象中,非位字段成员和位字段所在的单元的地址增加了它们的声明顺序。
结构经常用作二进制文件格式和networking协议的打包顺序的表示。 如果这样做会被打破。 另外,不同的编译器会以不同的方式进行优化,将代码连接起来是不可能的。 这根本不可行。
GCC比我们大多数人在从我们的源代码中生成机器代码更聪明; 然而,如果我们在重新安排我们的结构方面比我们聪明的话,我就会发抖,因为它是可以写入文件的数据。 一个以4个字符开始,然后有4个字节的整数的结构在GCC认为应该重新排列结构成员的另一个系统上读取将是没有用的。
gcc SVN确实有一个结构重组优化(-fipa-struct-reorg),但它需要整个程序的分析,目前不是很强大。
C编译器不会因为像你提到的alignment问题而精确地自动打包结构。 不能访问字边界(大多数CPU上的32位)的访问在x86上会受到严重的惩罚,并会导致RISC体系结构上的致命陷阱。
不要说这是一个好主意,但是你当然可以编写依赖于结构成员顺序的代码。 例如,作为一个黑客,通常人们将一个指向结构的指针作为他们想要访问的特定字段的types,然后使用指针algorithm到达那里。 对我来说这是一个非常危险的想法,但是我已经看到它被使用,特别是在C ++中强制一个被声明为私有的variables,当它来自第三方库的类中时是公开可访问的并且没有被公开地封装。 重新排列会员将完全打破这一点。
你可能想尝试最新的gcc主干,或者正在积极开发中的struct-reorg-branch。