如何(以及谁可以)实现C++委员会定义的标准库功能



当C++委员会发布一个新功能,该功能将成为该语言下一个标准的标准库的一部分时,他们是否也会发布一些源代码或有关如何实现该功能的某种指南?

让我们以unique_ptr为例。语言委员会只是为该类模板定义一个接口,并让编译器供应商随心所欲地实现它?标准库功能的实现过程究竟是如何发生的?

任何人都可以为尚不支持它们的平台实现标准库的某些部分吗?假设我想实现C++标准库的一些很酷的功能,以便在微控制器环境中使用它。我该怎么做?我应该在哪里查找信息?如果我决定开源我的项目,我可以这样做吗?我是否需要完全遵循标准规定,或者我可以编写不合规的版本?

通常,

  • 每个新的库功能都会经过一个提案。

  • 如果该提案进入C++委员会的图书馆发展工作组,它将经历一系列迭代(据我所知,这是一个"艰难的基础")。

  • 它经历了一系列的细化过程,如下所述

  • 如果它需要 (TS) 技术规范(自 C++11 起),它就会去那里烘烤。例如,#include <filesystem>在 C++17 之前位于文件系统 TS中。

  • 我相信委员会喜欢的一件事是实施经验

  • 更多信息可以在ISOCpp网站上找到

好吧,关于实现:

  • 有相当多的"库功能"不能纯粹作为库实现。 它们需要编译器支持。在这些情况下,编译器提供了您可以挂钩的"内在"。例如,clang 为某些type_traits提供内在

  • 大多数库功能都有一些实现经验,主要来自 Boost 库。

  • 您实际上可以查看编译器附带的默认标准库的源代码:

    • libc++ for Clang
    • libstdc++ for GCC
  • 可悲的是,大多数实现都使用一大堆下划线。主要是因为它们保留供"标准库"使用。


任何人都可以为尚不支持它的平台实现标准库的一部分吗?

是的,您可以,到目前为止,您的编译器支持该平台,并且该平台或操作系统提供了可用的 API。例如。std::coutstd::ifstream元素等等都需要特定于平台的支持。

假设我想实现C++标准库的一些很酷的功能,以便在微控制器环境中使用它。我该怎么做?

您可以查看其他人的代码并从那里开始。我们向巨人学习。一些开源示例:

  • 电子离
  • 标准CPlusPlus
  • uClib++

我该怎么做?我应该在哪里查找信息?

  • 您可以在C++库中查看引入该功能的论文。例如,std::optional在这里有一个独立的实现,在提案阶段用作参考实现。

  • 你可以检查标准库,做一个费力的研究。

  • 搜索互联网。
  • 或者按照标准的规定从头开始编写

我是否需要完全遵循标准规定,或者我可以编写不合规的版本?

没有强制遵循C++标准库指定的内容。那将是你"自己的"图书馆。

正式地说,没有。与所有标准一样,C++标准设定规则,而不是实施。但是,从实际的角度来看,如果没有建议的实现,几乎不可能将新功能引入标准库,因此您经常可以找到建议附带的功能。

至于你关于"你能写出不合规的版本吗"的问题,你可以为所欲为。采用可能取决于您的合规性,也可能不 - 众所周知,超级广泛采用的 MSVC 违反了C++标准。

通常,新功能不是标准化的,除非委员会有一些确凿的证据证明它可以实现并且会很有用。 这通常包括 boost 中的原型实现、GNU 库或商业编译器供应商之一。

标准本身不包含任何实施指南 - 它纯粹是一个规范。 编译器供应商(或其分包商)选择如何实现该规范。

unique_ptr的特定情况下,它从boost::unique_ptr被采用到标准中 - 您仍然可以使用后者。 如果你有一个编译器可以为你的微控制器编译,几乎可以肯定它将能够构建足够的提升来使unique_ptr工作。

没有什么能阻止你编写一个不合规的实现(除了一个微不足道的点,如果你把它卖为符合标准,而事实并非如此,你可能会得到你当地的等价物贸易标准来敲门。

委员会不发布任何参考实现。在早期,事情变得标准化,然后工具开发人员离开并实施标准。这种情况已经改变,现在委员会寻找在标准化之前已经实现和测试的功能。

此外,重大发展通常不会直接进入标准。首先,它们成为称为技术规范或TS的实验性功能。然后,这些TS可以在以后纳入主标准。

您可以自由编写自己的C++标准库实现。梅花堂有一个测试套件(商业,我没有联系,但梅花堂非常参与C++标准化)。

我认为不合规没有任何问题。几乎所有的实现都有一些扩展。只是不要做出任何虚假声明,特别是如果您想销售您的产品。

如果您有兴趣参与,可以通过您的"国家机构"(美国的ANSI,英国的BSI等)来完成。isocpp网站有一个关于标准化的部分,这将是一个很好的起点。

最新更新