GCC为什么不优化结构?

时间:2020-03-06 14:34:11  来源:igfitidea点击:

系统要求某些原语与内存中的某些点对齐(int表示为4的倍数的字节,short表示为2的倍数的字节,以此类推)。当然,可以优化这些以浪费最小的填充空间。

我的问题是,GCC为什么不自动执行此操作?是否以某种方式缺少更明显的启发式(从最大尺寸要求到最小尺寸的顺序变量)?是否有一些代码依赖于其结构的物理顺序(这是一个好主意)?

我之所以问是因为,GCC在很多方面都进行了超级优化,但在这一方面还没有,我在想,必须有一些相对很酷的解释(对此我不予理会)。

解决方案

结构经常被用来表示二进制文件格式和网络协议的打包顺序。如果这样做的话,那将会中断。此外,不同的编译器将对优化进行不同的处理,并且无法将两者链接在一起。这根本不可行。

由于我们提到的对齐问题,C编译器不会自动打包结构。不在字边界上访问(在大多数CPU上为32位)在x86上带来了沉重的代价,并在RISC体系结构上造成致命陷阱。

在从源代码生成机器代码方面,GCC比我们大多数人都聪明。但是,如果它比我们更聪明地重新安排我们的结构,我会发抖,因为它是例如可以写入文件。如果在另一个由GCC决定应重新排列结构成员的系统上读取,则以4个字符开头并具有4字节整数的结构将无用。

gcc不会对结构的元素重新排序,因为那样会违反C标准。 C99标准的6.7.2.1节规定:

Within a structure object, the non-bit-?eld members and the units in which bit-?elds
  reside have addresses that increase in the order in which they are declared.

gcc SVN确实具有结构重组优化(-fipa-struct-reorg),但是它需要整个程序的分析,并且目前还不是很强大。

并不是说这是一个好主意,但是我们当然可以编写依赖于结构成员顺序的代码。例如,作为黑客,人们通常将指向结构的指针转换为要访问的内部某个字段的类型,然后使用指针算法到达该结构。对我来说,这是一个非常危险的想法,但是我已经看到了它的用处,尤其是在C ++中,当一个声明为私有的变量位于第3方库中的某个类中并且未公开封装时,可以强制将其公开访问。重新排序成员将完全破坏这一点。