在 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
的支持。改进了对即将到来的 C++14 标准的实验性支持。
对于支持的目标平台,也有很多改进,比如:
- 在 x86-64 和 ia32 平台上,实现了对 AVX-512 指令集的支持。
- GCC 4.8 引入的局部寄存器分配器(Local Register Allocator,LRA)之前支持的目标平台只有 ia32 和 x86-64,现在在 Aarch64、ARM、S/390 和 ARC 平台上已经默认启用,在 PowerPC 和 RX 平台上也可以选择启用。
更多细节,可以参考相关页面。
活动推荐:
2023年9月3-5日,「QCon全球软件开发大会·北京站」 将在北京•富力万丽酒店举办。此次大会以「启航·AIGC软件工程变革」为主题,策划了大前端融合提效、大模型应用落地、面向 AI 的存储、AIGC 浪潮下的研发效能提升、LLMOps、异构算力、微服务架构治理、业务安全技术、构建未来软件的编程语言、FinOps 等近30个精彩专题。咨询购票可联系票务经理 18514549229(微信同手机号)。
评论