今天我们将总结开发团队在最新版VisualStudio201916.2中带来的一系列关于C++后端(Backend)的更新。我们在之前一篇关于构建时间优化的文章中也提到,VS开发团队通过优化构建中的链接过程来提高构建吞吐量并减少项目构建时间。通过一系列对比测试,对于大型项目的构建,在DebugInfo模式下构建效率提升了近3倍(甚至更多),同时在/下构建效率提升了2倍增量构建模式。有图有真相:以下是之前没有提到的其他优化点内联优化当一些函数内部有分支语句,在循环中调用时,这些函数会更加内联。代码生成优化通过用内联汇编指令替换一些常见的数学函数(例如:std::isnan、std::ldiv、std::lldiv)来减少整体操作的开销。如果项目的目标平台是x86或者x64,优化器会识别工作在最底层单元的迭代器指令,对其进行FMA(FusedMultiply-Add)和constantfoldeing优化。迭代器优化一些小的迭代循环(通常少于12次迭代)将被优化为:/arch:AVX对于某些迭代器的单元,如果它的大小与迭代器的大小完全匹配。优化在某些包含指针变量的循环中自动迭代失败时生成的代码序列。分析优化优化了控制流的分析过程,一些已经被证明返回true/false的复杂分支语句将被去除。添加了一个新的过程敏感的严格指针分析过程。这个指针会在不同的场景下被处理,比如在当前作用域之外访问它的时候,或者可以安全访问它的时候。其他常规优化在函数返回多个值对象时启用函数的复制省略。使用LTCG编译时,优化了指针减法的操作流程。请注意:在某些特殊情况下,指针减法运算包括可以优化掉的除法运算。为x86或x64平台生成和简化FMA指令。其中包括为某些全局迭代器类型的变量启用FMA。优化了C++20中飞船运算符的代码生成。说到飞船算子,这里简单解释一下:飞船算子包含在最新的C++20标准中,可以通过启用/std:c++latest选项来启用这个算子。该运算符可用于在某些比较函数(如std::strong_ordering::less)和编译时计算常量期间更有效地进行常量扩展。优化了memset代码,具体而言,unwind定义被内联替换为对更快的CRT版本的调用。在一些包含常量字节的循环中(例如:0xABABABABBB),它也被CRT版本的memset所取代。合并了完全相同的异常处理状态,减少了C++程序的大小。请注意,目前该优化点只能在FrameHandler4下使用。当VisualStudio201916.3发布时,这个FrameHandler4将成为默认配置。说了这么多对我来说简直是天书的优化点,反正我是有点懵,可能是我功力不够吧。如果我能用大白话概括这篇文章的内容:还好,还好,VS全宇宙最强,好吧!总结一如既往:请尝试VS2019。如有任何问题,请写信给开发团队。
