Подтвердить что ты не робот

Почему sizeof (std::string) только восемь байтов?

Почему размер std::string, как определено sizeof(std::string), дает 8?
Я думал, что он должен быть больше 8, поскольку он должен иметь элемент данных int (sizeof(int) == 8 на моей машине) для предоставления std::string::length() и std::string::size() в O (1) и, возможно, a char* для символы.

4b9b3361

Ответ 1

Реализация std::string не указана стандартом С++. Он описывает только поведение классов. Тем не менее, я ожидаю, что в классе будет больше информации о указателе. В частности:

  • Указатель на фактическую строку.
  • Доступный размер.
  • Используемый фактический размер.

Конечно, все они хранятся в динамически распределенном местоположении и, таким образом, занимают ровно столько же пространства, сколько char* [в большинстве архитектур].

На самом деле, глядя на заголовок С++, который поставляется вместе с моей машиной Linux, реализация довольно понятна, когда вы смотрите (что, по комментариям, является "pre-С++ 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, скрытый внутри нескольких слоев геттеров и немного отливки...

Ответ 2

Поскольку вся ваша реализация хранилищ std::string является указателем на кучу, где хранятся все данные.