【问题标题】:How can I find implementations of the C++ Standard Library? [duplicate]如何找到 C++ 标准库的实现? [复制]
【发布时间】:2015-05-18 05:09:13
【问题描述】:

我很想了解某些 C++ 功能的工作原理。我正在尝试学习诸如 std::function 之类的 C++11 概念,但我一直在碰壁,例如我不理解的 INVOKE(function, arguments, return)。人们告诉我,“哦,忽略它并使用 auto”,但我想真正深入了解 C++ 及其标准库的工作原理,所以我想找到标准库的源代码。

我猜 C++ 标准库在某种程度上与 C 标准库以及 std::iostream 之类的东西在最低级别的杂乱汇编/二进制实现有关,但我对更高级别的东西感兴趣像智能指针和 std::function 这样的抽象。鉴于许多 C++11 库曾经是 Boost 库,我如何才能找到 C++ 标准库实现的源代码?

【问题讨论】:

  • 找到源代码是一件几乎微不足道的事情,但理解它可能是一个挑战。问题是代码需要非常严格的规则并同时具有高性能,因此您需要以可读性为代价进行大量优化。关于std::function,考虑自己写一个,包括std::bind 的代码。这将为您提供有关该问题的宝贵见解。
  • c++ stl 主要在头文件上实现,所以一个很好的开始是跳转到你的 IDE 中的定义或类似 cscope 的东西
  • STL 不是 C++ 标准库,特别是 std::function 不是 STL 的一部分,@bolov。
  • 如果你有IDE,在地方,如#include 头部点击鼠标查找声明或实现
  • @UlrichEckhardt 我知道,我只是懒得输入 C++ 标准库,也不太关心我如何称呼它,只要消息的重点是明确的。但你是对的。该死的你让我打字这么多:)

标签: c++ c++11 standard-library


【解决方案1】:

标准 C++ 库的两个最流行的开源实现是:

两个网站都包含指向带有源代码的 git/svn 存储库的链接。

【讨论】:

  • 我目前已经下载并从 GCC 的 git 只读存储库中提取,目前正在阅读 libstdc++!它看起来很神秘,但我想我很高兴。谢谢大家!
  • el.pescado 你能在这里添加 MSVC STL 吗? github.com/microsoft/STL
【解决方案2】:

如果您关心GCC,您可以深入了解libstdc++ 的源代码。事实上,它有时会利用标准 C 库之上的优势(例如,::operator new 可能会调用 malloc 等...)

请注意,由于 C++ 库是标准的一部分,因此其中一些可能以编译器特定的方式实现。

原则上,没有什么要求标准头文件是真正的操作系统文件;编译器可以以不涉及任何文件的特定方式解析#include <vector>。我知道没有编译器能做这么多!

特别是,libstdc++ 使用了一些GCC builtins 和一些GCC attributesClang/LLVM 恰好也能理解)。

有些标准类型需要(或受益于)编译器的内部支持。例如,GCC 有一些特定的代码来处理va_liststd::initializer_list(当然还有像int...这样的基本类型)等等。另外,C++ 的编译器实现closures(或@987654327) @) 与其他类等相关...

此外,GCC 的一些优化通道(它有数百个)在设计时考虑了libstdc++ 实现的一些特性。

顺便说一句,使用最近的 gdb 调试器,例如libstdc++6-4.9-dbg debian 软件包也可能有帮助。

【讨论】:

  • “另外,C++ 闭包(或 lambda 函数)的编译器实现必须与其 std::function 实现等兼容......”,不,一个闭包只是operator() 的类类型,所以std::function 不需要做任何特别的事情来支持它。
猜你喜欢
  • 2019-12-17
  • 1970-01-01
  • 1970-01-01
  • 2014-05-21
  • 2012-02-28
  • 2016-08-10
  • 1970-01-01
  • 2017-10-20
  • 2014-10-06
相关资源
最近更新 更多