__gnu_cxx::__rc_string_base< _CharT, _Traits, _Alloc > Class Template Reference

Inherits __gnu_cxx::__vstring_utility<_CharT, _Traits, _Alloc>.

List of all members.

Public Types

Public Member Functions

Protected Types

Static Protected Member Functions


Detailed Description

template<typename _CharT, typename _Traits, typename _Alloc>
class __gnu_cxx::__rc_string_base< _CharT, _Traits, _Alloc >

Documentation? What's that? Nathan Myers <ncm@cantrip.org>.

A string looks like this:

                                        [_Rep]
                                        _M_length
   [__rc_string_base<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 "add" instruction: _Rep::_M_refdata(), and __rc_string_base::_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.

All but the last paragraph is considered pretty conventional for a C++ string implementation.

Definition at line 81 of file rc_string_base.h.


The documentation for this class was generated from the following file:

Generated on Thu Jul 23 21:17:20 2009 for libstdc++ by  doxygen 1.5.8