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