C ++ 11 внутреннее представление std :: string (libstdc ++)

Как std :: string внутренне представлен в c ++ 11 (libstdc ++)?

Копаясь внутри реализации, я нашел:

/*  A string looks like this:
*
*                                        [_Rep]
*                                        _M_length
*   [basic_string<char_type>]            _M_capacity
*   _M_dataplus                          _M_refcount
*   _M_p ---------------->               unnamed array of char_type
*
*  Where the _M_p points to the first character in the string, and
*  you cast it to a pointer-to-_Rep and subtract 1 to get a
*  pointer to the header.
*
*  This approach has the enormous advantage that a string object
*  requires only one allocation.  All the ugliness is confined
*  within a single %pair of inline functions, which each compile to
*  a single @a add instruction: _Rep::_M_data(), and
*  string::_M_rep(); and the allocation function which gets a
*  block of raw bytes and with room enough and constructs a _Rep
*  object at the front.
*
*  The reason you want _M_data pointing to the character %array and
*  not the _Rep is so that the debugger can see the string
*  contents. (Probably we should add a non-inline member to get
*  the _Rep for the debugger to use, so users can check the actual
*  string length.)
*
*  Note that the _Rep object is a POD so that you can have a
*  static <em>empty string</em> _Rep object already @a constructed before
*  static constructors have run.  The reference-count encoding is
*  chosen so that a 0 indicates one reference, so you never try to
*  destroy the empty-string _Rep object.
*/
// _Rep: string representation
//   Invariants:
//   1. String really contains _M_length + 1 characters: due to 21.3.4
//      must be kept null-terminated.
//   2. _M_capacity >= _M_length
//      Allocated memory is always (_M_capacity + 1) * sizeof(_CharT).
//   3. _M_refcount has three states:
//      -1: leaked, one reference, no ref-copies allowed, non-const.
//       0: one reference, non-const.
//     n>0: n + 1 references, operations require a lock, const.
//   4. All fields==0 is an empty string, given the extra storage
//      beyond-the-end for a null terminator; thus, the shared
//      empty string representation needs no constructor.
struct _Rep_base
{
size_type       _M_length;
size_type       _M_capacity;
_Atomic_word    _M_refcount;
};

Я не очень понимаю эти комментарии:

  • считается ли std :: string ref? Как? Я имею в виду _M_refcount не указатель, поэтому, если одна строка изменяет его, другая не может видеть его.
  • буфер лежит сразу после заголовка? Если это так, я не очень понимаю, почему.

6

Решение

GCC отошел от пересчитанной строки, чтобы следовать стандарту c ++ 11, но учтите, что вполне возможно, что ваша программа будет использовать его как часть реализации совместимости ABI.

std::string не имеет _Rep_Base член, но указатель на _Rep с _Rep наследование от _Rep_Base

Это то, что объясняется здесь:

 *  Where the _M_p points to the first character in the string, and
*  you cast it to a pointer-to-_Rep and subtract 1 to get a
*  pointer to the header.

Да, но после заголовка объекта _Rep, и ваша строка имеет только указатель на него.

0

Другие решения


По вопросам рекламы [email protected]