看新闻很累?看技术新闻更累?试试下载 InfoQ 手机客户端,每天上下班路上听新闻,有趣还有料!
GCC 8.1 是 GNU 编译器集的最新主版本,该版本对即将到来的 C++2a 标准的某些部分提供了实验性支持。此外,GCC 8.1 改进了性能分析驱动的优化,并把 Go 支持提升到了 1.10.1 版本。
虽然对于即将到来的 C++ 草案,有关工作尚处于起步阶段,但 GCC C++ 前台提供了两个新标识-std=c++2a
和-std=gnu++2a
,以便启用已经预先批准的部分 C++ 新特性,其中包括指定初始化、针对位域的默认成员初始化器、针对预处理程序逗号省略的 VA_OPT、 lambda 捕获 [=, this] 、简化的隐式lambda 捕获等等。要了解GCC 8 中的全部C++2a 特性,请查阅 C++ 状态页面。
此外,C++ 的前台输出现在改进了诊断信息,包括改进了位置和位置范围,并提供了若干新的故障排除线索。例如,在以下情况下,编译器现在可以提供一个线索,如在定义之前使用宏,试图访问类或结构的私有字段,当旧式的转换可以用static_cast
、const_cast
或reinterpret_cast
替代。
GCC 8.1 显著改善了性能分析驱动的优化。这些优化使用对被检测代码的性能分析结果决定优化哪一部分代码。例如,GCC 现在默认会把面向x86 的函数分成热区和冷区。热函数的优化力度更大,GCC 会把它们放在同一个区域里,增强局部性。同样,GCC 现在能够从一个有效运行的程序中检测不执行的代码,比如,它在某一时刻触发了未定义的行为。
谈到优化,该版本还新增了循环优化,如 -floop-unroll-and-jam
执行外部循环展开和内部循环融合,-floop-interchange
执行嵌套循环中的循环互换,增强数据局部性。一些已有的优化器也经过了改进,包括-floop-nest-optimize
和-ftree-loop-distribution
。所有优化器都是使用-O3
标识默认启用的。
前面已经提到,Go 支持经过了改进,这得益于 Go 1.10.1 的完整实现,这是 Go 最新的官方版本。此外,其垃圾收集器现在是完全并发的了。
最后需要注意的一点是, GCC 8.1 还引入了 Armv8.4-A 架构支持,可以通过-march=armv8.4-a
选项启用,可伸缩向量扩展(SVE)支持现在是作为Armv8.2-A 架构及更高版本的可选扩展。
GCC 8.1 还包含许多更有趣的变化,要了解全部细节,请查看官方的发布说明。
评论