【问题标题】:How can I see the actual implementation code of different data structures in C++?如何查看 C++ 中不同数据结构的实际实现代码?
【发布时间】:2021-03-01 13:17:28
【问题描述】:

有没有办法查看用于实现不同数据结构的实际代码,例如 C++ 中的 list、vector、unorderd_map、map、set。

我很想看看这些实现的效率。

我很惊讶谷歌在这方面没有合理的结果。

谢谢。

【问题讨论】:

  • 不是(大部分)它们只是在标题中吗?
  • 因为这些是模板,并且为了实际实例化这些模板,它们的完整定义必须可见,您会惊喜地在编译器的头文件中找到“实际代码”。
  • 您可以相信,这些实现比您或我编写的任何东西都更有效(和正确)。即使对于长期的专业人士来说,它们通常也完全无法阅读,并且被允许做我们凡人无法做到的事情。
  • 请注意,标准库代码的编写要求与用户代码不同。特定的标准库实现将在编写时考虑到特定的体系结构或编译器,并且可能会进行仅在该上下文中有意义的优化。它还可以依赖编译器扩展,从而允许以不可移植的方式编写它,并且在某些情况下会是未定义的行为。标准库实现也使用为此目的而保留的标识符。简而言之,对从标准库代码中学到的东西要有选择性。
  • 此外,您可以查看 cppreference.com 站点的“可能的实施”部分。比如这里是std::advancepossible implementation

标签: c++ list vector data-structures set


【解决方案1】:

C++ 标准有不同的实现,其中一些是开源的。例如,gcc 的实现称为 libstdc++。例如std::vector<T>的源码可以参考这里:https://gcc.gnu.org/onlinedocs/gcc-4.6.3/libstdc++/api/a01115_source.html

您可以在文件中看到的一个有趣示例是 std::vector<T>::push_back() 只是调用 std::vector<T>::emplace_back()

00370       template<typename _Up = _Tp>
00371         typename __gnu_cxx::__enable_if<!std::__are_same<_Up, bool>::__value,
00372                     void>::__type
00373         push_back(_Tp&& __x)
00374     { emplace_back(std::move(__x)); }

【讨论】:

  • 微软标准库实现github.com/microsoft/STL
  • "simply calls" 将其留给标准实现来使如此简单的转发调用变得如此模糊。至少在这种情况下,我明白为什么会这样(std::vector&lt;bool&gt; 和保留标识符),但看到标准标题总是让我感到震惊。
  • @FrançoisAndrieux 确实,在查阅标准标头时总是会感到惊讶。
猜你喜欢
  • 2023-02-24
  • 1970-01-01
  • 1970-01-01
  • 2017-03-15
  • 1970-01-01
  • 2011-02-07
  • 2010-12-05
  • 2013-12-03
  • 1970-01-01
相关资源
最近更新 更多