VS 2019到16.1到16.6中的C++ 20特征和修复

最新消息

我们一直忙于在MSVC的编译器和标准库中实现C++ 20的特性,并将后者迁移到 GitHub上的microsoft/STL -事实上,我们一直很忙,没有发布C++工具集 自从 VS 2019 16.0工具集变更日志 . 因此,这里是编译器特性和STL特性/修复程序,这些特性/修复程序在去年已交付生产使用。

null

作为提醒 /std:c++17 以及/std:c++latest 编译器选项是使用C++ 17和C++ 20的必要条件。

比2019年16.1

新功能(感谢我们的实习生Paolo Torres):

新的语言功能:

正确性修复:

  • 修复了VS 2019 16.0中的一个回归问题,在使用具有不相等分配器的分配器扩展移动构造函数时,无序关联容器的桶计数可能会高于预期值。
  • 删除了中不存在的标准极性函数,该函数阻止编译极性(1.0,2.0)。
  • 执行了 LWG-3025型 ,它修复了map、multimap、unorderedu map和unorderedu multimap的演绎指南,以启用从例如{pair{1,2}、{3,4}的演绎。
  • 执行了 LWG-3012型 ,它要求std::atomic的参数可以是copy-constructible、move-constructible、copy-assignable和move-assignable,以及前面的可复制需求。
  • 删除了非标准std::identity,为新标准std::identity扫清了道路(多亏了我们的实习生保罗·托雷斯
  • 重写以提高吞吐量和codegen(特别是对于调试编译),并在Clang下修复了atomic的constexpr构造中的一个bug。

性能和吞吐量修复:

  • 删除了几个以前用于实现STL特性的内部“便利”函数,这些功能与每个函数开销选项(如/RTC1和/JMC)的调试codegen交互较差。
  • 将complex改为调用std::hypot而不是一个稍微不同的库实现,以使用Vivian An An在/fp:fast下的优化器中对hypot进行的编译器优化。
  • 修复了vector::reference的swap函数成为隐藏的朋友,改进了在交换不相关的不可交换类型时的编译器诊断。
  • 修复了关联容器在内部使用启用迭代器调试的迭代器的几个地方。
  • 通过去除自递归和尝试区域,优化了无序关联容器的再散列操作。
  • 通过尽可能用可变模板定义类模板,并大大简化makeu signedu t和makeu unsignedu t,提高了的吞吐量。

其他改进:

  • 该标准要求实现支持一组特定的方面专门化。MSVC的STL允许使用非标准的facet专门化,通常会产生不希望的结果。在这个版本中,我们实现了一个off-by-default模式来强制只使用标准的facet专门化,为非标准用法发出一个静态的u断言。使用/Du ENFORCEu FACETu SPECIALIZATIONS=1编译将请求此模式。

比2019年16.2

新功能:

新的语言功能:

正确性修复:

  • 修复了基本的u字符串,为复制分配提供了强大的异常安全保证,并在u容器u复制u分配分配器上使用了不相等的传播u。
  • 修复了_ITERATOR_DEBUG_LEVEL==1,不再对基于节点的容器forward_list、list、set、map、multiset、multimap、unordered_set、unordered_map、unordered_multiset或unordered_multimap进行迭代器所有权断言。发现这些断言在存在拼接、合并或使用C++ 17 NoDyHAAD的情况下拒绝有效程序的条件。
  • 固定列表的remove if算法允许容器自引用作为标准允许但不要求的扩展。
  • 修复了前向u列表::在处理双排他范围后擦除u,以避免容器损坏。libcxx的测试套件发现了此处理中的边缘案例。
  • 修复了multiset和multimap,可以使用提供的提示控制等效元素范围内的相对元素插入顺序。
  • 修复了将Win32错误代码erroru INVALIDu NAME解释为“找不到文件”错误而不是status()中的致命I/O错误的问题。
  • 修复了当exceptions()设置了eofbit时,遇到文件结尾时不设置badbit的istream::sentry。
  • 修复了istream::sync()允许streambufs抛出pubsync()。
  • 针对新的C++ 20关键字在中的宏化进行了防范。
  • 修复了mbctype.h和之间的冲突。mbctype.h宏化了u M2,因此现在避免将其用作标识符。
  • 修复了deque迭代器孤立,这是导致崩溃在调试模式。
  • 修正了从u chars()错误影响某些角落案件与次正常。
  • 已从溢出/下溢的u chars()行为更改为与strtod()行为一致(请注意,这是由 LWG-3081型 提出了不同的解决方案。)

性能和吞吐量修复:

  • 如果constexpr应用到更多的地方,包括,以及用于实现deque、string和vector的分配器范围算法。
  • 修复了基于树的关联容器set、map、multiset和multimap,以便始终使用提示参数(如果提供)。
  • 修复了基于树的关联容器set、map、multiset和multimap的代码大小减少的问题,因为相同的二进制搜索操作现在同时支持插入操作(如insert或emplace)和普通查找函数(如lower u bound或find)。以前,这是以优化器无法合并的方式复制的。
  • 中删除了更多的try区域。
  • 优化的关联容器映射、集合、无序的集合映射和无序的集合放置,以避免在直接向容器传递密钥实例时插入重复密钥时分配节点。
  • 修复了前向u列表::调整大小以避免重复遍历前向u列表来计算大小。
  • 减少了前向u列表::在迭代器调试成本之后插入u。
  • 中,通过Ryu Printf优化,将最短长度固定到u chars()更快。

其他改进:

  • 将STL的必需版本Clang增加到8.0.0。

比2019年16.3

新功能:

新的语言功能:

正确性修复:

  • 实现了isu-trivial/isu-trivialu v类型特性,即isu可构造性和isu-trivialu可复制性,以解决MSVC和Clang的isu-trivial内部函数中的错误。
  • 检测到更多的非编译器工具(Qt的MOC和Windows的MIDL,除了预先存在的Windows资源编译器的检测),有时会处理C++头文件,并使用预处理器对STL头的内容进行隐藏,以避免在STL使用新的语言构造时发生破坏,而这些新的语言构造是这些工具无法理解的(这是一次尽力而为的尝试;理想情况下,人们一开始不会将这些工具指向STL头。)
  • 在适配容器上根据相应的操作实现堆栈和队列的比较操作,而不是在适配容器上根据==和<实现所有比较操作。
  • 修复了pmr::monotonicu resource::release中的一个错误,该错误导致在从monotonicu资源进行后续分配时使用释放的内存。
  • STL现在只对容器用户提供的类型使用allocator::construct,因此默认初始化而不是值初始化的分配器不再破坏容器。
  • STL现在不会在堆栈上创建临时值,而不经过容器的分配器构造。
  • 针对客户请求的更多默认关闭警告进行防御,如C4582、C4583、C4587、C4588和C4800。
  • currentu exception()和currentu exceptions()现在在终止处理程序中返回正确的值。
  • 实施 LWG-2996型 “缺少共享u ptr操作的rvalue重载”。
  • 实施 LWG-3038型 “多态分配程序::分配不应允许整数溢出来创建漏洞”。
  • 实施 LWG-3074型 “valarray的非成员函数应仅从valarray推断”。
  • 实施 LWG-3130型 “[input.output]需要许多addressof”。
  • 实施 LWG-3131型 “万物皆有”。
  • 简化的是空的,积分的,浮点的。以前,我们明确地在C++ 14模式中专门化了非内联变量模板,这在技术上被标准禁止,并且给Clang带来了头痛。

性能和吞吐量修复:

  • 使用uu is u same内在函数在Clang上实现is u same/is u same u v类型特征。
  • 在执行批量操作时,基于节点的容器将更频繁地重用节点,而不是取消分配和重新分配所有内容。例如,给定一个包含C元素的列表L,L.assign(N,T)现在只释放未使用的C–N元素或只分配新需要的N–C元素,而不是先释放所有C元素,然后再分配所有N元素。

其他改进:

  • 不再包括
  • 现在发出一个警告/错误:“提供std::experimental::filesystem的头已被Microsoft弃用,将被删除。它被C++ 17文件系统>标题所取代,提供STD::FielSoS.您可以定义u SILENCEu EXPERIMENTALu FILESYSTEMu DEPRECATIONu WARNING来确认您已收到此警告。“
  • 删除了非标准的头。
  • 删除了STL中不必要的“inline”关键字。
  • 提高了STL/墙壁的清洁度。请注意,这是由跟踪的正在进行的工作 微软/STL#186 .
  • 消除了STL头中的所有C类型转换。
  • 加强了各种功能的例外。

比2019年16.4

新功能:

  • 将STL的必需版本Clang增加到8.0.1。这显著地启用了对Clang的STL char8u t支持,Clang以前的版本不知道如何在msabi中破坏char8u t。
  • 实施 P1754R1“将概念重命名为标准u案例” .
  • 实施部分 P0896R4“<范围>” :
    • 迭代器特性的更改
    • 迭代器和范围概念的添加
    • 范围::iteru移动和范围::iteru交换自定义点
    • 范围访问自定义点(ranges::begin和ranges::end、ranges::size、ranges::empty、ranges::data和ranges::cdata的normal/const/reverse/const reverse变体)
    • 关联的类型别名:ranges::iteratoru t、ranges::sentinelu t、ranges::rangeu valueu t、ranges::rangeu referenceu t、ranges::rangeu differenceu t和ranges::rangeu rvalueu referenceu t
    • 对数组、基本字符串、基本字符串视图、valarray和vector进行必要的修改,以对连续范围概念进行建模
  • 在MSVC中用C++ 14模式激活STL[NODDEARDAR]属性。
  • 实现了一般精度ToA字符(),完成C++ 17 CARCONV>。

新的语言功能:

正确性修复:

  • 中显式指定了一些枚举类型的底层类型,这些类型使用逐位操作来避免存储不可表示的值(这是形式上未定义的行为,如Clang的UBSAN所述)。
  • 实施 LWG-3196“如果T是数组,则std::optional格式错误” (它的格式已经不正确,但现在有一个友好的静态消息)。通过简化optional与T比较的元编程,以及在optional::swap中使用“if constexpr”而不是标记分派,吞吐量略有提高。
  • 应用 用户提供的解决方案 在公共参考中查找IntelliSense错误。
  • std::filesystem::directoryu条目不再声明不存在的文件是常规文件。
  • std::filesystem::directoryu iterator(“”)不再在当前的u path()上迭代。
  • std::filesystem::recursive_directory_iterator在传递包含嵌入null的路径时不再触发无限循环。
  • 修复了在list::splice期间迭代器调试支持中容器大小可能被错误更新的边缘情况。
  • 改进了NaN的浮点处理。

性能和吞吐量修复:

  • 通过减少包含的内容量。
  • 改进了list和forward-u-list的成员算法,不需要距离/提前呼叫,因为距离/提前呼叫是非随机访问范围,效率低下。
  • 部分实施 LWG-2550“无序容器的clear()应为O(元素数)” 就我们目前的ABI所允许的范围而言,这将加快无序容器的速度,其中包含大量的桶,但元素很少。我们只能在哈希函数不例外的情况下这样做,因为在不遍历每个bucket时删除元素需要对哈希函数求值。
  • 在几个容器函数上增强了noexcept。
  • 原子<8字节>现在在x86而不是cmpxchg8b上通过普通加载实现。
  • 通过对MSVC和IntelliSense编译器使用条件显式in-pair/tuple/optional,提高了吞吐量。

其他改进:

  • 移除了在定义为0的C++数学中的“逃逸孵化”宏,它在C++中禁止了C++ 17数学特殊函数的定义。

比2019年16.5

请看 https://github.com/microsoft/STL/wiki/Changelog 有关所有未来VisualStudio版本中STL的发行说明。

新的语言功能:

比2019年16.6

请看 https://github.com/microsoft/STL/wiki/Changelog 有关所有未来VisualStudio版本中STL的发行说明。

新的语言特点和国家机构评论决议:

更多信息

对于VisualStudio更改(超出C++工具集)和下载链接,请参见 VS发行说明 VS预览发行说明 . 你可以通过 开发者社区 ,还可以通过 microsoft/STL GitHub问题 .

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