MSVC Build Tools 14.52 候选版本现已发布

MSVC Build Tools 14.52 候选版本现已发布

💡 原文英文,约6300词,阅读约需23分钟。
📝

内容提要

微软发布 MSVC 14.52 候选版,这是转稳定前的最后预览,预计11月随 VS 18.12 稳定发布。该版本可通过 /std:c++23 在生产环境使用 C++23,更新涵盖编译器、链接器与标准库:新增 C++23 语言模式、即时升级和 Unicode 标识符;优化内联、循环、向量化及 ARM64 支持;STL 已完整支持 C++23 功能,并新增 constexpr cmath;同时改进 AddressSanitizer 的性能与诊断。

🔎

延伸解读

C++23 生产就绪与迁移注意

此版本中 C++23 已可通过 /std:c++23 在生产环境使用,且 /std:c++23preview 成为别名但已弃用,未来将移除。开发者应尽快将构建脚本中的预览选项替换为标准选项,以避免后续工具集升级时构建失败。同时,/clr 现已支持 C++23 及更高模式,为混合模式项目提供了新可能。

constexpr cmath 的当前限制

STL 已完整支持 C++23 功能,包括 P0533R9 的 constexpr cmath,但该特性目前仅限 MSVC 且需显式启用 /Zc:cmath。部分函数如 acosh、asinh、atanh、cosh、sinh、tanh、erf 以及 erfc、lgamma、tgamma 尚未实现为 constexpr,需等待 LLVM-libc 后续支持。Clang 和 EDG 的支持也将在编译器机制就绪后启用。

ARM64 与 x64 优化亮点

编译器在 ARM64 上共享地址计算、优化 NEON 常量构建与尾调用决策,并支持 SVE2 的 LUTI2/LUTI4 等指令。x64 方面,LTCG 内联可丢弃未使用字段的计算,循环优化能外提不变加载,向量化更积极。这些改进可能提升性能,但需注意 SVE2 等特性依赖特定硬件,且部分优化可能改变代码行为,建议充分测试。

AddressSanitizer 性能与诊断改进

AddressSanitizer 通过移除重复的隔离工作、使用 MSDIS 作为回退指令长度解码器,减少了“无法识别指令”的失败,并默认启用。同时,堆地址缓存、内存映射堆检查等优化带来显著性能提升。若需调试,可设置 verbosity=3 并搜索“MSDIS instruction decoder:”日志。这些改进有助于在开发中更高效地发现内存错误。

❓

Q&A

MSVC 14.52 候选版本什么时候会发布稳定版?

MSVC 14.52 预计在 11 月转为稳定版,并随 Visual Studio 18.12 稳定版通道发布。

如何在 MSVC 14.52 中启用 C++23 语言模式?

使用 /std:c++23 编译器选项即可启用 C++23 语言规则。原有的 /std:c++23preview 拼写仍然有效,但已弃用,并将在未来更新中移除。

MSVC 14.52 的 STL 是否已完整支持 C++23?

是的,STL 现已完整支持 C++23 功能,因为实现了 P0533R9 “constexpr For <cmath> And <cstdlib>”。该支持目前仅限 MSVC,需在 /std:c++23 下配合 /Zc:cmath 使用。

MSVC 14.52 在 ARM64 平台上有哪些优化改进?

ARM64 现在可以跨相关加载和存储共享地址计算,减少重复算术并创造更多成对加载/存储机会;已知 NEON 常量无需数据加载即可构建;标量加载、广播和通道插入更多情况下可折叠为 NEON 加载指令;循环向量化器支持额外的 floor、ceil、trunc 和 round 操作;尾调用决策改为按调用进行;内联考虑浮点和向量寄存器压力;原生 ARM64 支持 SVE2 的 lane-indexed svmullb/svmullt 内建函数、LUTI2/LUTI4 查找表(含 BF16 形式)、浮点绝对最小/最大指令和 Common Short Sequence Compression 操作;支持 __preserve_none 和 [[msvc::musttail]];/feature:sme 下接受 SME 属性和 ZA 状态类型;栈布局可复用互斥 switch 分支的局部变量槽位,大幅减少大型 switch 的帧大小。

MSVC 14.52 中 AddressSanitizer 有哪些性能改进?

AddressSanitizer 通过移除重复的隔离工作提高了运行时性能;使用 MSDIS 作为回退指令长度解码器进行拦截,减少“无法识别指令”失败(默认开启,可通过 ASAN_OPTIONS=windows_use_msdis_decoder=false 禁用);运行时性能改进包括堆地址缓存、更高效的内存映射堆检查以及更快的分配器标志赋值,在多个运行时场景中带来显著性能提升。

MSVC 14.52 中 constexpr cmath 支持情况如何?

constexpr cmath 支持在 /std:c++23 下默认关闭,可通过 /Zc:cmath 开关启用。目前仅 MSVC 支持,Clang 和 EDG 支持将在必要编译器机制可用时启用。在 /std:c++latest /Zc:cmath 下,已基本实现 C++26 P1383R2 对 <cmath> 的 constexpr 新增(<complex> 暂无变化)。部分函数尚未由 LLVM-libc 实现,因此还不是 constexpr:double 的 acosh、asinh、atanh、cosh、sinh、tanh、erf;float 和 double 的 erfc、lgamma、tgamma。

🏷️

标签

➡️

继续阅读