有多少 C++ 标准库需要编译器支持?

BCS*_*BCS 12 c++ compiler-construction standards

大多数标准库的实现似乎相当简单,无论是从库的其他部分、操作系统系统调用还是裸 C++ 代码来看。更多位(例如<atomic>)可能需要 ASM 实现

但至少有一些位看起来只能根据编译器内在函数来实现(例如,<source_location>当然,std::has_virtual_destructor, 的其他一些部分<type_traits>等)。

最后一组特别令人感兴趣,因为它有点模糊了标准语言标准本身之间的界限。这可能是编译器之间库实现可移植性的最重要限制之一。

具体来说,我的问题是:

是否有属于最后一类的零件的明确列表?该标准在谈论这些事情时是否使用了特定术语?


编辑:

作为一点背景信息,这个问题是在关于“引导”编译器和库堆栈是什么样子的思想实验中出现的。这是一个与平台无关的源代码球,只需绝对最少的手动步骤和外部依赖项,即可获得完全符合标准的库和编译器。重点不是性能,而是健壮性、简单性和“相信它实际上是正确的”外部依赖的最小内核。

因此,实践中通常完成的方式,或者标准委员会划分它们的方式,甚至制作快速编译器所需的内容(无论哪种意义上)都不会自动相关。

Moo*_*uck 3

C++ 规范并没有真正考虑将库与语言分开,因此任何答案都将是相当空洞的。然而,我们可以利用一个怪癖来找到答案……

\n

https://eel.is/c++draft/requirements#compliance

\n
\n

“16.4.2.5 独立实现”

\n
\n
\n

...独立实现具有实现定义的标头集。该集应至少包括表 27 中所示的标头。

\n
\n
\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n\n \n\n\n\n\n\n\n\n\n\n\n\n\n\n\n
子条款标头
[支持类型]常见定义<cstddef>
[cstdlib.syn]C标准库<cstdlib>
[支持限制]实现属性<cfloat>、\xc2\xa0<限制>、\xc2\xa0<限制>、<版本>
[cstdint.syn]整数类型<cstdint>
[支持动态]动态内存管理<新>
[支持.rtti]类型识别<类型信息>
[支持.srcloc]源位置<源位置>
[支持.异常]异常处理<异常>
[支持.initlist]初始化列表<初始化列表>
[化学机械]比较<比较>
[支持.协程]协程支持<协程>
[支持.运行时]其他运行时支持<cstdarg>
[概念]概念库<概念>
[错误号]错误编号<cerrno>
[系统错误]系统错误支持<系统错误>
[记忆]记忆<记忆>
[类型.性状]类型特征<类型特征>
[比率]编译时有理算术<比例>
[公用事业]实用组件<实用程序>
[元组]元组<元组>
[选修的]可选对象<可选>
[变体]变体<变体>
[预期的]预期对象<预期>
[函数.对象]函数对象<功能性>
[字符转换]原始数字转换<字符转换>
[少量]位操作<位>
[字符串.视图]字符串视图类<字符串视图>
[字符串.类]字符串类<字符串>
[c.字符串]空终止序列实用程序<cstring>,\xc2\xa0<cwchar>
[大批]类模板\xc2\xa0array<数组>
[连续视图]连续访问<跨度>
[视图.multidim]多维访问<mdspan>
[迭代器]迭代器库<迭代器>
[范围]范围库<范围>
[算法]算法库<算法>,\xc2\xa0<数字>
[c.数学]浮点类型的数学函数<数学数学>
[原子]原子学<原子>
[调试]调试<调试>
\n
\n

据我所知,这是标准库中需要编译器支持且无法编写为独立于编译器的部分列表的超集。官方没有这么说,但实际上,这个列表是我发现的最接近客观答案的列表。

\n

实际上,其中一些可以用可移植的 C++ 编写,例如std::string.

\n

  • @BCS:有一个可能涉及编译器的比较要求。当你有两个不相关的指针时,不需要`&lt;`和`&gt;`来处理它们——但是`std::less`*需要*来工作。在典型的硬件上,这是非常简单的(只需比较地址),但一些机器具有奇怪的寻址,需要编译器做一些额外的工作来创建指针的总顺序,以便进行工作比较。 (3认同)
  • 一个很好的起点,我认为你的_~half_是“有点悲观”。我猜它接近 95%,如果您包含可以通过调用特定于 CPU 的手写(但仍然与编译器无关)ASM 来完成的内容,则可能会超过 99%。(操作系统特定的系统调用也是如此。) (2认同)