【问题标题】:Where can I find data member of std::bitset?我在哪里可以找到 std::bitset 的数据成员?
【发布时间】:2018-09-11 05:26:03
【问题描述】:

当我阅读 cppreference 上的 bitset page 时,我试图找到一些 data memeber 列来查看数据是如何存储的。我发现没有这样的列,也没有另一个 std 类,例如std:string。然后我转到https://github.com/llvm-mirror/libcxx/blob/master/include/bitset,查看bitset synopsis 注释部分,我找不到任何关于它的数据成员的信息。为什么?我在这里想念什么?非常感谢任何 std 类的示例。

【问题讨论】:

  • 因为它们是私有的,所以您不需要知道它们?它们不是界面的一部分。
  • 在这里了解您的动机可能会有所帮助。我不认为这些类的私有实现很重要,所以你只是好奇还是你想摆脱它?
  • @Tas 只是出于好奇。当我试图理解一个类时,我通常会先检查它的数据成员。
  • @Rick:你应该停止这样做。如果你想了解一个类,首先看它的文档,而不是它是如何实现的。查看它提供的接口,而不是它隐藏的接口。
  • @NicolBolas 这就是理论,在实践中,人类的思维通常从具体到抽象,而不是相反。查看实现通常有助于了解您实际处理的内容并修复标准在内存中提供的保证,而反过来则需要向内存发送大量明显随机的规则。深入了解如何实施 IMO 标准容器对于直观了解如何有效使用它们至关重要。

标签: c++


【解决方案1】:

CppReference 记录了公共接口,这是标准要求的唯一内容,您应该关心。

libc++ 标头的概要也是如此:它只是标准的复制粘贴,可能作为库实现者的参考。您可以在下面找到实现的详细信息。

STL 容器的数据成员是您不应该关心的实现细节,并且可能会在各种标准库实现之间以及同一库的不同版本甚至不同编译标志之间发生变化。

【讨论】:

    【解决方案2】:

    检查libcxx的实现,下面受保护的数据成员是如何实现真实位的。

    https://github.com/llvm-mirror/libcxx/blob/master/include/bitset#L163

    template <size_t _N_words, size_t _Size>
    class __bitset {
    public:
      typedef size_t __storage_type;
      // ...
    protected:
      // ...
      __storage_type __first_[_N_words]; // <========= the data
    };
    
    // ...
    
    template <size_t _Size>
    class _LIBCPP_TEMPLATE_VIS bitset
        : private __bitset<
              _Size == 0 ? 0 : (_Size - 1) / (sizeof(size_t) * CHAR_BIT) + 1, _Size>
    { /* ... */ };
    

    【讨论】:

      猜你喜欢
      • 2011-03-11
      • 1970-01-01
      • 2017-11-26
      • 1970-01-01
      • 1970-01-01
      • 2021-04-09
      • 2014-07-16
      • 2012-05-30
      • 2013-07-13
      相关资源
      最近更新 更多