代码之家  ›  专栏  ›  技术社区  ›  Alex Gartrell

为什么GCC不优化结构?

  •  42
  • Alex Gartrell  · 技术社区  · 16 年前

    系统要求某些原语与内存中的某些点对齐(整数到字节是4的倍数,短到字节是2的倍数,等等)。当然,可以对其进行优化,以在填充中浪费最少的空间。

    我的问题是为什么GCC不能自动完成这项工作?是否以某种方式缺少更明显的启发式(从最大尺寸需求到最小尺寸的订单变量)?某些代码是否依赖于其结构的物理顺序(这是一个好主意)?

    7 回复  |  直到 12 年前
        1
  •  79
  •   tzot    16 年前

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

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

        2
  •  28
  •   Serafina Brocious    16 年前

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

        3
  •  11
  •   tzot    16 年前

    GCC在从源代码生成机器代码方面比我们大多数人都聪明;然而,如果它在重新安排结构方面比我们更聪明,我会不寒而栗,因为它是可以写入文件的数据。如果在另一个GCC决定重新安排结构成员的系统上读取以4个字符开头然后有一个4字节整数的结构,那么它将是无用的。

        4
  •  7
  •   alex strange    16 年前

        5
  •  2
  •   Alex M    16 年前

    C编译器不会自动打包结构 正因为 像你提到的对齐问题。不在字边界上的访问(在大多数CPU上为32位)在x86上会带来沉重的惩罚,并在RISC体系结构上造成致命的陷阱。

        6
  •  2
  •   Michel    16 年前

    并不是说这是个好主意,但您当然可以编写依赖于结构成员顺序的代码。例如,作为一种黑客行为,人们通常将指向结构的指针转换为他们想要访问的某个字段的类型,然后使用指针算法到达该字段。对我来说,这是一个非常危险的想法,但我看到它被使用,特别是在C++中强制一个变量被声明为私有的,当它在一个第三方库中的一个类中被公开访问,而不是公开封装的。重新安排成员将完全打破这一局面。

        7
  •  1
  •   A. K.    9 年前