Большинство современных std::string
реализаций 1 сохраняют очень маленькие строки непосредственно в стеке в массиве char
статического размера вместо использования динамической памяти кучи. Это известно как Оптимизация небольших (или коротких) строк (SSO). Это позволяет реализациям избежать выделения кучи для небольших строковых объектов и улучшает локальность ссылок.
Кроме того, будет std::size_t
элемент для сохранения размера строк и указатель на фактическое char
хранилище.
Как это конкретно реализовано, отличается, но что-то вроде следующего работает:
template <typename T>
struct basic_string {
char* begin_;
size_t size_;
union {
size_t capacity_;
char sso_buffer[16];
};
};
На типичных архитектурах, где sizeof (void*)
= 8, это дает нам общий размер 32 байта.
1 «Большая тройка» (libstdc ++ GCC начиная с версии 5, реализация Clang libc ++ и MSVC) - все это делает. Другие тоже могут.