Откуда в объекте string 24 байта? C++

sizeof показывает, что сам объект string занимает 24 байта. При наведении курсора на объект в коде аналогично (возможно реализация данного класса может отличаться в зависимости от компилятора и IDE (у меня MSVC)). Указатель занимает 8 байт + поле с размером строки типа site_t 8 байт.

От куда ещё 8 байт? Какое поле там ещё есть?


Ответы (1 шт):

Автор решения: HolyBlackCat

Как и в std::vector, третье поле - это capacity, т.е. сколько памяти выделено. И size и capacity могут быть числами, а могут - указателями (на начало массива плюс это число).

Все три крупные реализации используют SSO (т.е. "short string optimization"), т.е. когда строка достаточно короткая, она не выделяется в куче, а записывается прямо поверх (некоторых из) этих полей.

Если на какой-то реализации sizeof(std::string) > 3 * sizeof(void *), значит они добавили еще дополнительных байт для SSO, которые для длинных строк вообще не используются.

→ Ссылка