VS 2015更新3中的STL修复

VS 2015更新3 被释放了 一个多月前。  虽然它的发行说明提到了一些STL修复,但这里有一个全面的列表。

null

(以前的更改日志: RTM第1部分 , RTM第2部分 , 更新1 , 更新2个功能 ,和 更新2个补丁 .)

STL特征

/std:c++latest 启用以下新功能: P0025R1型 “clamp()”, P0185R1型 “是可交换的,不是可交换的”,和 P0272R1型 “非常量基本字符串::data()”。

/std:c++latest 还控制以下旧功能的删除: N4190型 “正在删除自动u ptr、随机u shuffle()和旧的内容”, P0004R1型 “删除不推荐使用的Iostreams别名”, 长荣2385 “function::assign allocator argument doesn’t gong sense”,以及各种非标准特性(std::tr1命名空间、一些仅tr1的机器和std::identity结构)。

编译器选项/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/atomic中的静默错误codegen。

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++库

bion@microsoft.com

凯西·卡特- @密码键

SDEⅡ——Visual C++库

cacarter@microsoft.com

斯蒂芬T。拉瓦维- @斯蒂芬特拉瓦维

高级开发人员——Visual C++库

stl@microsoft.com

© 版权声明
THE END
喜欢就支持一下吧
点赞0 分享