GCC 4.9 发布,完整支持 Go 1.2.1

  • 臧秀涛

2014 年 4 月 23 日

话题:语言 & 开发架构

GCC 4.8 发布一年零一个月之后,GCC 4.9 终于发布了。

GCC 4.9 是一个主要版本,提供了大量新功能。下面我们来看一下:

通用的优化器改进

  • AddressSanitizer这款快速的内存错误检查程序已经支持 ARM。
  • 添加了 UndefinedBehaviorSanitizer(ubsan),这是一款快速的未定义行为检查程序,可以通过 -fsanitize=undefined 开启。它可以在运行时诊断未定义行为,目前支持 C 和 C++。
  • LTO(Link-time optimization,链接时优化)的改进:
    • 重写了类型合并(Type merging),新实现在极大提升速度的同时减少了内存使用量。
    • 提早去掉虚方法,减少了目标文件的大小,而且改进了链接时的内存使用量和编译时间。
    • 函数体可以根据需要提早加载和释放,改进了链接时的内存使用量。
    • C++ 隐含的跟虚函数处理有关的key 方法现在可以优化掉了。
    • 在使用链接器插件时,使用 -flto 选项编译,会生成较为轻巧的目标文件,其中仅包含支持 LTO 的中间语言表示。可以使用 -ffat-lto-objects 选项来创建包含其他目标代码的文件。

      在构建支持调试的 Firefox 时,占用的内存从 15GB 减少到 3.5GB,链接时间从 1700 秒减少到 350 秒。这一点让开发者非常兴奋

  • 跨过程优化的改进:
    • 新的类型继承分析模块,改进了去虚化(Devirtualization,是一种优化机制,指去掉虚函数分派相关操作)。去虚化现在会考虑匿名命名空间和 C++11 的final关键字。
    • 新的推测性去虚化遍(使用 -fdevirtualize-speculatively 控制,这里的“遍”指编译器处理时的 Pass)。
    • 对于通过推测做出的直接调用,在代价并不低的地方切换回间接调用。
  • 反馈制导优化的改进:
    • 对使用了 C++ 内联函数的程序的分析更为可靠了。
    • 引入了一个新的函数重排序遍(通过 -freorder-functions 控制),可以极大减少大型应用的启动时间。

新语言与特定于语言的改进

  • 提供了 Go 1.2.1 的完整实现。
  • C 族语言:

    GCC 现在可以生成彩色的诊断信息。可以通过-fdiagnostics-color=auto选项控制在终端中输出彩色信息。下图是一个例子:

    (点击图像放大)

  • C 语言相关:

    增加了用于支持 ISO C11 的 _Atomic、_Generic、_Thread_local 等特性。

  • C++ 相关:

    C++ 前端增加了对C++1y一些新特性的支持,比如普通函数的返回类型推导、数字分隔符、多态 Lambda 等。

  • 标准库相关:

    最重要的改进是对 C++11 <regex> 的支持。改进了对即将到来的C++14 标准的实验性支持。

对于支持的目标平台,也有很多改进,比如:

  • 在 x86-64 和 ia32 平台上,实现了对 AVX-512 指令集的支持。
  • GCC 4.8 引入的局部寄存器分配器(Local Register Allocator,LRA)之前支持的目标平台只有 ia32 和 x86-64,现在在 Aarch64、ARM、S/390 和 ARC 平台上已经默认启用,在 PowerPC 和 RX 平台上也可以选择启用。

更多细节,可以参考相关页面

语言 & 开发架构