VS 2015 Update 1中的STL修复

VS 2015更新1 现在可用 ,它包含许多STL修复。  (这是自2010年SP1以来,我们首次在主要版本之外发布STL修复程序。  2015年RTM中没有严重的问题–我们只是想更快地为您提供修复,我们的内部流程使这变得更容易。)  像往常一样,我写了一个详尽的变更日志,比如 第1部分 第2部分 2015年RTM的修复。  请注意,虽然update1包含许多编译器/IDE/etc.改进(包括对表达式SFINAE的部分支持),但这里没有提到这些改进——我个人无法跟踪所有改进!

null

首先,Steve Wishnousky最近加入了VC库团队,他在Update 1中得到了一些修复:

*unordered_meow::max_bucket_count()返回的值不正确(VSO#144294)/ 连接#1764567 ).  现在它是正确的。

*我们的内部助手函数_Allocate()和_Deallocate()被不必要地模板化,产生了比必要的对象文件更大的文件(VSO#130290)。  现在它们已经去模板化了,应该会稍微收缩对象文件。

此外,Hong Hong还修复了中报告的几个错误,这些错误是由/等的内部包含引起的:

*<未来>不尊重Š有Š例外=0(TFSŠ1127004)/ 接#1137364 ).  虽然这是目前未记录,未经测试,不支持的微软,我们决定解决这个问题无论如何。

*间接定义了一个非标准的stdx::declval()(TFS#1194345/ 连接#1494998 ).  此内部帮助程序已重命名为Concurrency::details::declval()。  (就目前而言,在非难看的并发名称空间和其中的机器中拖拽的是设计。)

接下来,我修复了几个bug:

*给定enable_shared_from_this,尝试使用shared_ptr将无法编译(TFS#1178296)。  现在volatile像const一样工作。

*分配器错误地假设UserAlloc::construct()/destroy()返回void(当它们存在时),触发了非void返回类型的编译器错误(TFS#1184701)。  现在我们正确地接受(并忽略)非void返回类型。

*在2015年RTM的tupleu size/tupleu元素中,我试图通过对非tuple-ish事物的静态断言来提供帮助。  不幸的是,这阻止了SFINAE,所以它是不符合的(TFS#1192603,TFS#1205400)/ 接#1600812 ).  现在我们遵循标准。

*标准要求rethrowŠexception()标记为[[noreturn]],但我们的没有,这可能会在编译时中断代码(VSOŠ125155)/ 连接#1657472 ).  除了修复这个问题之外,我还检查了其他丢失的事件(没有任何),并且我将STL中的每一个declspec(noreturn)改为[[noreturn]]。  (它们是同义词,所以这只是在可能的情况下尝试使用标准机械。  请注意,CRT继续使用u declspec。)

*在2015年RTM的memu fn()中,我试图通过使用调用约定处理一个特别模糊的场景来变得聪明。  这对函数的签名几乎没有明显的影响,用户不可避免地注意到了这一点(VSO#134162)。  我去掉了聪明,所以memu fn()完全遵循标准。

*原子意外地使用了来自VC编译器前端(TFS#1181758)c1x的非标准行为/ 接1393505 ).  (问题是:在void*和Object*之间转换时,静态转换和重新解释转换是等价的。但是,在void*和Function*之间进行转换时,在重新解释转换工作时禁止静态转换,N4567 5.2.10[expr.reinterpret.cast]/8。)  <原子>现在按照标准使用reinterpretu cast。

*除了之外,我还修复了STL的头文件(和测试)以使用Clang/C2(“Clang with Microsoft CodeGen”),这也将有利于Clang/LLVM。  由于EDG(用于IntelliSense的前端)经过多年的严格测试,我们的头很少意外地使用非标准行为,因此只需要对头进行一些更改。  作为这项工作的一部分,我报告了Clang/C2中的许多bug,它们在发布之前已经修复,所以您永远不会受到它们的影响。  这甚至发现了一些bug(例如类型特征、原始字符串文本中的crlf)以及Clang本身的改进机会,这将有利于Windows和非Windows平台的Clang/LLVM。  特别感谢davidmajnemer(与微软无关)和其他Clang开发人员,他们在上游实施了这些错误修复和改进。

技术细节:Clang3.7附带了几个选项,-fms扩展和-fms兼容性。  -fms扩展控制非标准特性,如uu declspec(dllexport),STL需要它来完成工作。  -fms兼容性控制“bug兼容性”(即让Clang模仿C1XX bug),但当我和David在CppCon 2015见面时,我们意识到有两种bug兼容性:影响ABI的bug(例如布局)和不影响ABI的bug(例如接受无效)。  因此,对Clang的3.7后主干(并移植到Clang/C2版本)进行了一些更改。  现在,针对Windows时,始终启用与ABI相关的bug兼容性,因为这是与c1x/C2二进制文件链接兼容所必需的。  ABI无关bug兼容性由-fms兼容性控制。  我们的STL头文件(和测试)现在可以与-fno-ms一起工作-兼容性,最严格的一致性级别。  (有一个小的例外:中拖拽,这是在做一些不一致的事情,尽管相当无害。  该标准不允许通过值返回不完整的类,即使是从声明但从未定义的“虚构”函数返回。  当我发现这一点时,更新1的修复已经太迟了,所以Clang/C2在发布之前被暂时黑客攻击,以便接受这个特定的东西。  我已经修复了update2的,因此Clang/C2解决方案最终可以删除。)

*当我在附近的时候,我还修复了STL的头文件以使用/Za,并添加了全面的测试覆盖率。  /Za是c1x启用额外一致性的选项,但它也会在很少使用的代码路径中启用额外的编译器错误,因此我们不鼓励使用它。  (几年前,我停止了用/Za测试STL,因为它打破了vector>的完全有效的用法。  这个问题最终得到了解决,但我直到现在才恢复测试。)

请注意,/Za仍然受到编译器错误的影响,该错误会阻止您将它与STL一起使用(通常)。  VSO#122298号/ 接#1331482 “declspec(selectany)constexpr不与/Za一起工作”在多个翻译单元拖入时触发链接器错误,这在2015 RTM中是constexprized。  编译器已为更新2修复。  (我在STL的测试中暂时解决了这个问题——我们只有一个tu有多个tu,够搞笑的了。)

*数值u限制::infinity()/quietu NaN()/signalingu NaN()现在是constexpr,由GCC/Clang的编译器内置提供支持,这些编译器已在c1x/EDG中实现。  注意,signalingŠNaN()特别受到c1x bug(VSOŠ128935)的影响/ 接#1686806 ),导致sNaN的位在从函数返回时被修改,STL显然无法解决这个问题。

*丢失了几个noexcept,我已经添加了。

*通过避免不必要的拷贝,shared-u-ptr的原子操作(怪异的自由函数,而不是普通的refcount操作)的性能得到了改进。

*正如Clang/libc++的测试套件(TFS#917456,TFS#917467)发现的那样,位集<0>的成员函数在运行时表现不正常。  现在它们的行为是正确的,尽管bitset<0>仍然是最无用的东西。

最后,尽管我通常不列出编译器修复,即使它们影响STL(例如),但有一点值得一提:

*Tanveer Gani修复了VSOෘ103444“constexpr构造函数正在发射动态初始值设定项”。  这影响了新constexprized的STL,最重要的是std::once u标志,它现在根据标准的要求进行静态初始化。  请注意,此修复程序有一些不影响STL的限制(例如,使用virtuals仍然可以防止静态初始化),并且有一个可以禁用的虚假警告-请参阅Tanveer的回答 这个问题 更多信息。

这就是STL的update1changelog的结尾。  史蒂夫·维什努斯基( @史蒂夫维什努斯基 ),我们的另一个新员工比利·奥尼尔( @马尔瓦米尼贡 ),我正在为更新2做更多的修改-我们已经检查了几十个补丁和9个特性!  (这将是自2008年SP1以来,我们首次在主要版本之外发布STL特性。)

斯蒂芬T。拉瓦维( @斯蒂芬特拉瓦维 )

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

stl@microsoft.com

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