为什么sizeof(std :: string)只有八个字节?

sha*_*861 31 c++

为什么std::string尺寸由sizeof(std::string)屈服确定8
我认为这应该不仅仅是8因为它必须有一个int(sizeof(int) == 8在我的机器上)数据成员给予std::string::length()std::string::size()在O(1)和可能是一个char*字符.

Mat*_*son 33

std::stringC++标准未指定实现.它只描述了类的行为.但是,我希望课堂上有一个以上的指针信息.特别是:

  • 指向实际字符串的指针.
  • 尺寸可用.
  • 使用的实际尺寸.

它当然可以将所有这些存储在动态分配的位置,因此占用与char*[在大多数架构中] 完全相同的空间量.

实际上看一下我的Linux机器附带的C++头文件,当你看到它时,实现是非常清楚的(根据评论,它是"pre-C++ 11",但我认为大致具有代表性):

  size_type
  length() const _GLIBCXX_NOEXCEPT
  { return _M_rep()->_M_length; }
Run Code Online (Sandbox Code Playgroud)

然后按照:

  _Rep*
  _M_rep() const _GLIBCXX_NOEXCEPT
  { return &((reinterpret_cast<_Rep*> (_M_data()))[-1]); }
Run Code Online (Sandbox Code Playgroud)

这反过来导致:

  _CharT*
  _M_data() const _GLIBCXX_NOEXCEPT
  { return  _M_dataplus._M_p; }
Run Code Online (Sandbox Code Playgroud)

这导致

  // Data Members (private):
  mutable _Alloc_hider  _M_dataplus;
Run Code Online (Sandbox Code Playgroud)

然后我们到达:

  struct _Alloc_hider : _Alloc
  {
    _Alloc_hider(_CharT* __dat, const _Alloc& __a) _GLIBCXX_NOEXCEPT
    : _Alloc(__a), _M_p(__dat) { }

    _CharT* _M_p; // The actual data.
  };
Run Code Online (Sandbox Code Playgroud)

关于字符串的实际数据是:

  struct _Rep_base
  {
    size_type       _M_length;
    size_type       _M_capacity;
    _Atomic_word        _M_refcount;
  };
Run Code Online (Sandbox Code Playgroud)

所以,它是一个简单的指针,被称为_M_p隐藏在几个getter层和一些铸造......


Pau*_*ans 23

因为所有std::string商店实现都是指向存储所有数据的堆的指针.

  • 简单而最好的答案. (2认同)
  • 截至 2019 年,情况如此 - 在 Visual C++ 2019 中 `sizeof(std::string) == 28` (2认同)