系统要求某些基元与存储器内的某些点对齐(对于4的倍数的字节,对于2的倍数的字节的短路,等等).当然,这些可以被优化以浪费填充中的最小空间.
我的问题是GCC为什么不自动执行此操作?更明显的启发式(从最大尺寸要求到最小尺寸的订单变量)是否缺乏某种方式?一些代码是否依赖于其结构的物理排序(这是一个好主意)?
我只是问,因为GCC在很多方面都是超级优化的,但不是在这个方面,我认为必须有一些相对很酷的解释(我不知道).
gcc不会重新排序结构的元素,因为这会违反C标准.C99标准第6.7.2.1节规定:
在结构对象中,非位字段成员和位字段所在的单元具有按声明顺序增加的地址.
结构经常用作二进制文件格式和网络协议的打包顺序的表示.如果这样做会破坏.此外,不同的编译器会以不同的方式优化事物,并且将代码从两者链接在一起是不可能的.这根本不可行.
GCC比我们大多数人从我们的源代码生产机器代码更聪明; 然而,如果它比我们更聪明地重新安排我们的结构,我会颤抖,因为它的数据例如可以写入文件.与4个字符开始,然后的struct如果另一个系统中GCC决定,它应该重新安排结构成员上读取4个字节的整数将是无用的.
gcc SVN确实有一个结构重组优化(-fipa-struct-reorg),但它需要整个程序分析,目前还不是很强大.