Ответ 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
, скрытый внутри нескольких слоев геттеров и немного отливки...