微信号:infoqchina

介绍:有内容的技术社区媒体

GCC 4.9发布,完整支持Go 1.2.1

2014-04-24 15:10 InfoQ

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

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

通用的优化器改进

  • AddressSanitizer这款快速的内存错误检查程序已经支持ARM。

  • 添加了UndefinedBehaviorSanitizer(ubsan),这是一款快速的未定义行为检查程序,可以通过-fsanitize=undefined开启。它可以在运行时诊断未定义行为,目前支持C和C++。

  • LTO(Link-timeoptimization,链接时优化)的改进:

    • 重写了类型合并(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指令集的支持。

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


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


***********************************

本文来自InfoQ微信公众账号:infoqchina

1、回复“今日新闻”,查看今天更新的新闻;

2、回复“今日英文”,查看今天英文站的更新;

3、回复“文章 +关键词”,搜索关键词相关内容;

4、回复“QCon”,了解QCon大会相关信息;

5、回复“活动”,了解最近InfoQ组织的线下沙龙;

6、回复“架构师”,获取《架构师》下载地址;

7、回复“投稿”,了解投稿和加入编辑团队的流程。

***********************************

 
InfoQ 更多文章 Facebook如何实现PB级别数据库自动化备份 学术派Google软件工程师Matt Welsh谈移动开发趋势 Spotify为什么要使用一些“无聊”的技术? 妹纸们放假了,汉纸们做啥? 大多数重构可以避免
猜您喜欢 综合指南:何时使用 Em 与 Rem 案例 | 流失用户召回实战分享 你为什么薪水那么低之 生产力 “二宝”诞生记 听说过Tomcat自己的web.xml吗?