内容提要
微软发布 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。