c-为什么GCC无法优化结构?

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

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

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

Alex Gartrell asked 2020-06-27T17:02:09Z
7个解决方案
76 votes

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

在结构对象中,非位域成员和位域所在的单位 居住的地址按照声明的顺序增加。

Damien Neil answered 2020-06-27T17:02:29Z
26 votes

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

Cody Brocious answered 2020-06-27T17:02:49Z
11 votes

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

tzot answered 2020-06-27T17:03:09Z
7 votes

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

alex strange answered 2020-06-27T17:03:29Z
2 votes

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

Alex M answered 2020-06-27T17:03:50Z
2 votes

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

Michel answered 2020-06-27T17:04:10Z
1 votes

您可能要尝试最新的gcc主干或正在积极开发的struct-reorg-branch。

[HTTPS://GCC.弓弩.org/wiki/cauldron2015?action=attach file&do=view&target=Olga+go了OVA Nevsky_+memory+layout+optimizations+of+structures+安定+objects.PDF]

A. K. answered 2020-06-27T17:04:35Z
translate from https://stackoverflow.com:/questions/118068/why-doesnt-gcc-optimize-structs