为什么GCC不优化结构?

Ale*_*ell 46 c optimization gcc struct

系统要求某些基元与存储器内的某些点对齐(对于4的倍数的字节,对于2的倍数的字节的短路,等等).当然,这些可以被优化以浪费填充中的最小空间.

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

我只是问,因为GCC在很多方面都是超级优化的,但不是在这个方面,我认为必须有一些相对很酷的解释(我不知道).

小智 76

gcc不会重新排序结构的元素,因为这会违反C标准.C99标准第6.7.2.1节规定:

在结构对象中,非位字段成员和位字段所在的单元具有按声明顺序增加的地址.

  • @ Evo510:我很困惑.要使用屏蔽,您还必须知道填充,这是语言无法保证的.所以,你不能使用面具.我错过了什么吗? (10认同)
  • 是的,但为什么这样定义? (7认同)
  • @nes1983 程序员可能对结构中数据的顺序做出假设,并且可能使用掩码来获取每个部分。如果结构被重新排序而不是屏蔽我是不正确的。 (2认同)

Cod*_*ous 26

结构经常用作二进制文件格式和网络协议的打包顺序的表示.如果这样做会破坏.此外,不同的编译器会以不同的方式优化事物,并且将代码从两者链接在一起是不可能的.这根本不可行.

  • 你的第一点非常有效.但我认为你的第二个不是.无论如何,来自不同编译器的编译代码是不兼容的. (6认同)
  • 这与网络或文件结构无关.实际上,BMP结构的标题紧紧地包含着落在与编译器不同的非自然边界上的元素. (2认同)
  • @JohannesSchaub-litb 这取决于;如果两个编译器都遵循相同的 ABI,那么它们就没有理由生成不兼容的代码。例如 GCC 和 Clang,以及 Windows 上 C 的 32 位 GCC 和 MSVC。 (2认同)

tzo*_*zot 11

GCC比我们大多数人从我们的源代码生产机器代码更聪明; 然而,如果它比我们更聪明地重新安排我们的结构,我会颤抖,因为它的数据例如可以写入文件.与4个字符开始,然后的struct如果另一个系统中GCC决定,它应该重新安排结构成员上读取4个字节的整数将是无用的.

  • 由于对齐(允许),直接读取/写入结构到文件无论如何都不是编译器/平台可移植的,请参阅[this](/sf/ask/377821321/)SO回答。 (4认同)

ale*_*nge 7

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