内容提要
微软发布MSVC Build Tools预览版更新(目标v14.53),涵盖编译器前端、后端、链接器和标准库。前端新增C++14下[[fallthrough]]支持及HRESULT转换警告,并降低内存占用;ARM64扩展SME实验支持,x64改进APX与AVX-512指令选择;优化器增强内联、向量化与自动函数分派;链接器新增/WARNUNUSEDLIBS选项并提升增量链接性能;同时修复大量开发者社区报告的缺陷。
延伸解读
预览版定位与获取方式
本次更新面向 v14.53 预览版,cl.exe 与 link.exe 版本号至少为 19.53.36930 / 14.53.36930。用户可通过 Visual Studio 2026 稳定通道或 Insiders 通道获取,但 Insiders 更新更频繁。安装时需勾选 x64/x86 或 ARM64/ARM64EC 的 MSVC Build Tools 预览组件,并按官方说明配置 IDE 与命令行。由于仍是预览版,微软鼓励通过 Developer Community 反馈问题,以便在正式发布前修复。
ARM64 的 SME 支持仍属实验性
ARM64 上通过 /feature:sme 扩展了对 Arm 可伸缩矩阵扩展的实验性支持,涵盖流式函数声明、直接与间接调用、链接时代码生成、异常处理及运行时状态管理辅助。但文章明确说明该支持仅限原生 ARM64,且仍不完整:不支持流式函数定义,也不支持 ARM64EC。此外,FPMR 寄存器相关指令需要硬件和操作系统支持。因此读者不宜将其视为可立即用于生产 ARM64 项目的完整方案。
优化器与链接器的实用改进
优化器方面新增了需主动启用的链接时自动函数分派,[[msvc::auto_dispatch]] 属性可从同一函数体生成 CPU 特定实现,由支持的加载器选择。内联、常量余数优化、向量化和循环去切换均有增强,并减少了运行时类型信息与异常处理数据的填充,有助于缩小 64 位可执行文件和 DLL。链接器新增可选的 /WARNUNUSEDLIBS,对未加载任何成员的输入库发出 LNK4324,并改善了输入文件较多时的增量链接性能。
大量缺陷修复与升级注意点
本次修复覆盖编译器前端、后端、链接器、模块、协程和 ARM64 代码生成等大量社区报告问题,其中包含多处 /O2 下的错误代码生成和内部编译器错误。文章还列出 14.51 与 14.52 预览版之间可能存在 ABI 破坏,导致 Boost.Serialization 运行时失败。对使用预览版的项目而言,升级前应关注这类兼容性风险,并在自身代码与依赖库上做回归验证,而不只是看新增特性。
Q&A
MSVC Build Tools 预览版这次更新到哪个版本了?怎么安装?
本次预览版目标版本为 v14.53,cl.exe 和 link.exe 打印的版本号至少为 19.53.36930 / 14.53.36930。可通过 Visual Studio 2026 稳定通道或 Insiders 通道获取(Insiders 更新更频繁)。安装时需勾选“MSVC Build Tools for x64/x86 (Preview)”或“MSVC Build Tools for ARM64/ARM64EC (Preview)”组件,并按 https://aka.ms/msvc/preview 的说明配置 IDE 和命令提示符。
这次更新在 C++ 语言符合性和编译器前端方面有哪些变化?
前端新增 C++14 模式下的 [[fallthrough]] 支持;新增 C4878 和 C4879 警告,用于检测 HRESULT/SCODE 与布尔类类型之间的显式或隐式转换(均为 4 级警告且默认关闭);新增 /Zc:__super[-] 和 /Zc:__if_exists[-] 控制微软扩展;通过改进缓冲源令牌的分配和生命周期管理降低了前端内存占用;新增 -fsanitize-coverage-ignorelist 作为 -fsanitize-coverage-blocklist 的替代拼写。
ARM64 和 x64 平台在代码生成方面分别有什么改进?
ARM64:在 /feature:sme 下扩展了 Arm 可伸缩矩阵扩展的实验性支持(流式函数声明、直接/间接调用、链接时代码生成、异常处理、运行时状态管理辅助),仅限原生 ARM64 且仍不完整,不支持流式函数定义和 ARM64EC;新增 ARM64_FPMR 常量及汇编器/反汇编器中的 FPMR 寄存器名;改进内联决策以考虑浮点和向量寄存器压力;用查表指令替换部分多步 NEON 零扩展序列。x64/x86:扩展 APX 条件比较生成(包括 switch 降级产生的比较)并改进条件移动指令选择;重新启用 unwind 版本 3 的紧凑 x64 epilog 生成;改进 AVX-512 指令选择,将算术与混合序列合并为合并掩码算术指令;用更短的地址计算指令替换符合条件的后期常量乘法。
优化器这次有哪些值得关注的增强?
新增可选的链接时代码生成自动加载时函数选择,[[msvc::auto_dispatch]] 属性可从同一函数体生成 CPU 特定实现供支持的加载器选择;改进内联决策以简化聚合对象并消除无用存储;改进 x86 和 ARM64 上的常量余数优化,用乘加移位序列替换硬件除法;移除循环内由循环边界可推导的冗余比较和不可达分支;扩展向量化机会(识别更多非重叠内存访问和标量打包方式),并部分支持三元素组的向量化;改进循环 unswitching 决策,包括通过指针读取的符合条件的条件;减少运行时类型信息和异常处理数据的填充,有助于减小 64 位可执行文件和 DLL 体积。
链接器新增的 /WARNUNUSEDLIBS 选项是做什么的?
/WARNUNUSEDLIBS 是一个可选链接器选项,会对每个未加载任何成员的目标输入库发出 LNK4324 警告。该警告支持 /IGNORE:4324 和警告视为错误的设置,且不会改变 /VERBOSE:UNUSEDLIBS 的行为。此外,本次更新还通过减少重复的文件名搜索,提升了输入文件数量较多项目的增量链接性能。
AddressSanitizer 的 windows_shadow_top_down 选项有什么作用?
这是 64 位 Windows 上可选启用的选项。在 AddressSanitizer 初始化前设置 ASAN_OPTIONS=windows_shadow_top_down=1,会将影子内存放在可容纳的最高可用地址范围,而不是最低范围。这可以在将插桩 DLL 加载到使用 .NET Framework 垃圾回收器的应用时减少托管运行时内存开销。该选项默认关闭,对 32 位 Windows 无效,且必须通过环境变量足够早地设置以影响初始化,__asan_default_options 设置得太晚,无法改变影子内存位置。