返回资讯中心
外部精选
软件工程
#开发者实时流

MSVC 为 C++23 准备 constexpr cmath 实验性实现,底层换用 LLVM Libc 数学库

来源标题:MSVC C++23: constexpr cmath with LLVM Libc

微软 MSVC 正为 14.52 版构建工具(编译器版本 19.52)准备 C++23 constexpr cmath 的实验性实现,实现基于 LLVM Libc 提供的新数学库。该功能需同时开启 /std:c++23 或更高版本与 /Zc:cmath 编译选项,初期默认关闭,因为新库可能改变现有程序的性能与精度表现。微软希望先收集用户反馈,再决定默认行为。

Hacker News 最新travelmalta2026/11/11 · 今天15 分钟阅读

以下正文由 AI 翻译自 Hacker News 最新(原文版权归原站所有),可能存在偏差,重要内容请以原文为准。

提案 P0533R9 使标准库中的大量数学函数在 C++23 中可进行编译期求值。实现该特性需要投入相当多的时间和精力,不过 MSVC 正在为 14.52 版生成工具(编译器版本 19.52)准备其试验性实现!我们仍在完善该特性,因此预计只有在其正式发布用于生产环境后才会尘埃落定。

该特性通过组合使用 /std:c++23 或更高版本以及 /Zc:cmath 编译器选项来启用。它最初以试验性形式提供并默认关闭,因为我们的实现由一套新的编译期和运行时数学库驱动,这可能会改变现有程序的性能和精度特性。我们的目标是在决定默认行为之前收集用户反馈,因此请试用该特性并在 Visual Studio Developer Community 上向我们提供反馈。

我们正在发布一系列配套博客文章,以解释我们为何选择新的数学库、新数学库能为用户带来什么,以及我们为在编译器中实现该特性所做的工作,本文是这一系列的第一篇!

自 2015 年起,cmath 和 cstdlib 中的数学函数由 C 运行时通过 math.h 和 stdlib.h 提供,Microsoft 将这些作为 Universal C Runtime(UCRT)的一部分发布。UCRT 由 Windows 操作系统(OS)团队而非 C++ 工具团队维护和部署。这样一来,C 运行时中稳定的部分可以通过 OS 更新就地维护,而与工具集绑定的部分则随 C++ 生成工具一起发布。得益于 C++ Team Blog 的不朽本质,你可以回到 2015 年阅读 Introducing the Universal CRT 以了解更多关于此次 CRT 重组的信息。

到了现代,UCRT 数学函数存在已知的数学不准确性。详见 Gladman 等人的 Accuracy of Mathematical Functions in Single, Double, Double Extended, and Quadruple Precision(刚刚出炉)。这些不准确性源于相当陈旧的实现,其历史可追溯到精度在计算上往往不可行的时代。如今这些实现很少被改动以保持向后兼容性,尽管它们偶尔会收到 OS 团队的精修更新。

由 OS 部署的不准确且会变化的数学函数,会导致数学计算依赖于执行时所处的 OS 版本和硬件架构。OS 升级或将程序移植到另一架构(例如从 x64 到 arm64)可能会悄无声息且出人意料地影响某些 UCRT 数学函数的结果。

在 C++23 中,这种情况对我们来说似乎难以为继,因为数学函数的编译期求值可能会以出人意料的方式成为应用程序二进制接口(ABI)的一部分,例如作为模板的参数提供。经过大量讨论,我们最终锁定了一组我们发现客户真正关心的标准:

UCRT 未能满足这些高要求,因此我们寻求替代方案。我们最初考虑自己编写一个新库,但很快意识到那将需要多年苦行僧式的研究。于是我们转向开源社区,专注于仅解决 C++23 cmath 特性的编译期部分(从而将运行时执行留给 UCRT),因为我们认为在运行时提供精度在计算上仍然不可行。

我们发现 LLVM C Library 在解决 C 运行时的数学部分方面已经取得了令人难以置信的进展。该项目以精度为首要目标,力求在所有舍入模式下实现正确舍入,Gladman 等人也证实了该项目的成功。通过追求数学精度,该库有效地固化了一个稳定的接口,允许实现上的灵活性和优化。该库维护活跃,拥有健康的社区支持。

浏览代码后发现,这是一个清晰、可组合的代码库,可以很容易地适配为用 MSVC 构建。完成适配后,我们惊喜地发现其性能数据常常可与 UCRT 相媲美。这使得将该库发布用于编译期和运行时成为可行。这使我们能够为用户程序运行的所有环境提供一致、稳定、精确且高性能的数学结果。

我们相信,浮点库中的数学精度是一个时机已到的理念。我们确信 libc 为我们提供了为用户构建稳定基础的手段,但反馈对于我们就如何以及何时推出该特性做出决定至关重要。请通过在构建中添加 /Zc:cmath 来试用试验性实现,并在 Visual Studio Developer Community 上向我们报告你发现的任何问题。它旨在独立于 /std:c++23 使用以启用新的运行时,不过编译期求值仅在 C++23 中可用。对低版本的支持尚未发布,但已在内部合并。更多信息请参见 microsoft/STL#6425。

构建并将 LLVM libc 集成到工具集中是该特性的主要工作。由于我们已经为 C++23 完成了这项工作,C++26 可以在该基础上构建而无需剧变。LLVM libc 尚未实现所有在 C++26 中成为 constexpr 的函数,但我们已经为已就绪的函数(如 sin、cos、tan 和 pow)添加了支持。我们正在关注那些尚未就绪的函数(如 lgamma)。

我们本希望本文相对简短,但我们还有一些即将发布的博客文章讨论该特性的细节。第一篇是由 libc 维护者撰写的客座文章,深入探讨了为产出 libc 所投入的令人难以置信的研究和工程工作。第二篇则解释了我们在 C++ 生成工具中为发布该特性所采用的一些技巧。

正文由 探How 从来源站点 RSS 同步,内容未经改写;遇到排版缺失或需要图片、视频时请以原文为准。

打开原文
去社区讨论 →