pointer allocate(size_type __n, const void* = 0) { if (__n > this->max_size()) std::__throw_bad_alloc(); return static_cast<_Tp*>(::operator new(__n * sizeof(_Tp))); }
void construct(pointer __p, const _Tp& __val) { ::new((void *)__p) _Tp(__val); }
/* _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. A string looks like this: @code [_Rep] _M_length [basic_string<char_type>] _M_capacity _M_dataplus _M_refcount _M_p ----------------> unnamed array of char_type @endcode 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 "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 "empty string" _Rep object already "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. */