VS 2015更新3 被释放了 一个多月前。 虽然它的发行说明提到了一些STL修复,但这里有一个全面的列表。
(以前的更改日志: RTM第1部分 , RTM第2部分 , 更新1 , 更新2个功能 ,和 更新2个补丁 .)
STL特征
/std:c++latest 启用以下新功能: P0025R1型 “clamp()”, P0185R1型 “是可交换的,不是可交换的”,和 P0272R1型 “非常量基本字符串::data()”。
/std:c++latest 还控制以下旧功能的删除: N4190型 “正在删除自动u ptr、随机u shuffle()和旧的
编译器选项/std:c++14 以及/std:c++latest 是 新推出的 在更新3中。
/std:c++14 (默认值)定义了201402的MyscCyLangLand,并说“启用C++ 14的特性,因为它们变得可用,并启用在更新2中传输的C++ 17个特性集”。这与Clang和GCC的-std=c++14模式有意不同。)
/std:c++latest 定义u MSVC u LANG>201402(确切值可能会更改),并说:“启用所有可用功能,包括功能删除;我喜欢遵守最新的工作文件,我愿意接受任意的破坏性修改”。
因为我们的STL实现支持三个半编译器(c1x、Clang、EDG-simulating-c1x和EDG-simulating-Clang),所以我们有一个单独的宏来控制STL的模式。 如果定义了MSVCu LANG,我们检查它,否则我们检查cplusplus。 (C1xx在实现C++ 11的所有特性之前,不会更新它的值。 然后STL定义u将ucxx17设置为0或1,这用于控制头的行为。 我们将支持重写此宏,但仅在一个方向上。 /std:c++latest /D_HAS_CXX17=0对于新编译器行为是可接受的请求,但是对于旧的STL行为是可接受的。 但是/std:c++14 /D_HAS_CXX17=1是不可接受的(请求旧的编译器行为,但请求新的STL行为)–我们不尝试阻止它,它暂时可以工作,但它可以并且可能会在将来的某个时候停止工作(每当新的STL功能需要依赖于新的编译器功能时)。
一般来说,LWG问题解决方案将无条件执行,并且不受u HAS u CXX17的控制。
最后,虽然我们不支持细粒度控制C++ 17 STL特性,但我们有单独的宏用于特征移除。 它们是u有u AUTO u PTR u ETC、u有u IOSTREAMS u MEMBERS、u有u FUNCTION u ASSIGN、u有u TR1 u NAMESPACE、u有u IDENTITY u STRUCT。 它们被定义为0或1,这取决于u HAS u CXX17的值,但是它们可以被重写(我们支持所有的组合)。
LWG问题
我们实现了C++ 14的 LWG 2064型 “基本u字符串中的更多noexcept问题”。
我们还实现了C++ 17的 长荣2296 “std::addressof应该是constexpr”, 长宽2596 “vector::data()应该使用addressof”,和 长波2688 “钳制未满足前提条件,对结果具有无关条件”。
STL修复
在更新2中,我们删除了一个内部u Destroyu range()助手中的元编程。 这个元编程在发布模式下是不必要的,但是它的删除显著影响了调试模式的性能(VSO#213185,VSO#218398)/ 接#2661660 ,邮编:219797/ 接#2683478 ). 在更新3中,我们通过恢复和改进元编程修复了这种回归。 与预更新2元编程不同,新的元编程调用用户定义的分配器的destroy()(如果存在)。用户定义的分配器可能需要使用C++ 11最小分配器接口,以便恢复预更新2调试性能,通常是通过移除结构()和销毁()成员函数。
通过将元编程优化推广应用于用户定义的分配器,而不仅仅是std::allocator(VSO#189231),提高了性能。 当用户定义的分配器未提供construct()和destroy()时,将激活此优化。
修复了x86(VSO#212461)上的atomic
STL现在避免使用 线程安全的“魔法静力学” 除非在绝对必要的时候,改进codegen。
tuple的完美转发构造函数现在避免了复制构造函数的竞争,修复了某些场景中的编译器错误(VSO#215996)/ 接#2632801 ,VSO#216014号/ 接#2633029 ).
通过更积极地调度到memcmp和memchr,std::equal和std::lexicographicalu的性能得到了改善,在某些场景中导致了性能的大幅提高;e、 g.在64位平台(VSO#180464)上等于(char*,char*,char*,char*)。
通过减少迭代器调试机制中簿记函数调用的数量,显著提高了调试构建的性能。
与发行版中的Update 2相比,string::push u的性能提高了40%,在调试版中有了更大的改进。
通过消除几种类型的空模板元编程支持调用(例如Iterucat),提高了跨所有标准算法的调试构建的性能。
通过减少函数对象副本的数量(VSO#91245),提高了所有获取函数对象的算法的性能。
对其余的算法应用了改进的对SCL不安全的DEPRECATE消息的诊断(在更新2中,只有少数算法连接到新的DEPRECATE机制中)。这也提高了在调试到标准算法时的调试体验,因为不再有任何#迭代器#调试#级预处理器交互声明标准算法的多个副本(VSO#180466)。
修正了无法编译的一些函数,如错误匹配(ITER,ITER,T[]),因为C++ 14的双范围算法和我们的非标准的标准迭代器Debug GrayayyLoad(VSO 211972)之间的交互。
通过在迭代之前检查第二个范围(如果可能的话),在1级和2级迭代器下提高了std::mismatch的性能。
修复了STL(VSO#194854)中违反默认关闭警告C4242的问题。 请注意,我们很少根据具体情况修复默认警告。 我们的政策是保持/W4/analyze干净,但我们不试图保持/Wall干净。
修复了std::pop#u heap(VSO#204655)中可能存在的整数溢出错误。
修正了一个潜在的悬空/clr:pure due 在保持区域设置锁的同时插入到CLR LoadLibrary调用。
修复了原子的返回值::operator=()(VSO#197633/ 接#2430244 ). 注意原子
通过在内部使用makeu shared()提高了异常u ptr的性能。
减少正则表达式匹配的堆栈空间消耗,在更多情况下避免堆栈溢出(VSO#208146)。
修正了使用ŠcarryŠengine::seed()进行Š减法Š以采用结果Š类型而不是无符号长(VSOŠ214595)/ 接#2610325 ).
修正了当m==数值限制<结果类型>::数字(VSO#219985)时,使用#进位Š引擎进行减法Š的行为。
我们在STL头中消除了更多非标准编译器扩展的无意使用,提高了一致性并使Clang更愉快(VSO#192363)。 请注意,iostreams头包含三个类内专门化的u Getvals(),这是一种非标准技术。 出于二进制兼容性的考虑,这在更新3中保持不变,但在STL的下一个主要版本中已经修复。 (Clang接受这一点而不发出警告,因为STL头是系统头。)
在RTM到update2中,STL包含一个没有文档记录的“escape hatch”来禁用constexpr用法,这涉及到在STL的头中出现的u CONSTu FUN和u CONSTu DATA宏。 这被证明是不必要的,所以在更新3中我们消除了这些宏。 现在STL的头无条件地提到“constexpr”。
isassignable现在由Clang的编译器钩子(以前是为c1x实现的)提供支持,简化了STL的头并潜在地提高了编译器的吞吐量。
std::addressof()现在由c1x和Clang的编译器钩子提供支持,允许它成为constexpr并提高编译器吞吐量。
STL容器和迭代器现在支持“花哨的指针”。
语言环境代码中的函数模板现在可以抵御重载的逗号运算符。
STL现在可以正确地处理POCS分配器(在容器交换上传播)。 请注意,POCCA/POCMA(在容器上传播u复制u分配/在容器上传播u移动u分配)被严重错误处理,直到并包括静默坏代码生成。 它们已经在STL的下一个版本中修复。
比利·罗伯特·奥尼尔三世- @马尔瓦米尼贡
SDEⅡ——Visual C++库
凯西·卡特- @密码键
SDEⅡ——Visual C++库
斯蒂芬T。拉瓦维- @斯蒂芬特拉瓦维
高级开发人员——Visual C++库