当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《为什么sizeof(std::string)只有八个字节?》经验,为你挑选了2个好方法。

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



1> Mats Peterss..:

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

指向实际字符串的指针.

尺寸可用.

使用的实际尺寸.

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

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

  size_type
  length() const _GLIBCXX_NOEXCEPT
  { return _M_rep()->_M_length; }

然后按照:

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

这反过来导致:

  _CharT*
  _M_data() const _GLIBCXX_NOEXCEPT
  { return  _M_dataplus._M_p; }

这导致

  // Data Members (private):
  mutable _Alloc_hider  _M_dataplus;

然后我们到达:

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

    _CharT* _M_p; // The actual data.
  };

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

  struct _Rep_base
  {
    size_type       _M_length;
    size_type       _M_capacity;
    _Atomic_word        _M_refcount;
  };

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



2> Paul Evans..:

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


简单而最好的答案.
推荐阅读
帆侮听我悄悄说星星
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有