Откуда в объекте string 24 байта? C++
sizeof
показывает, что сам объект string
занимает 24 байта. При наведении курсора на объект в коде аналогично (возможно реализация данного класса может отличаться в зависимости от компилятора и IDE (у меня MSVC)).
Указатель занимает 8 байт + поле с размером строки типа site_t
8 байт.
От куда ещё 8 байт? Какое поле там ещё есть?
Ответы (1 шт):
Как и в std::vector
, третье поле - это capacity
, т.е. сколько памяти выделено. И size и capacity могут быть числами, а могут - указателями (на начало массива плюс это число).
Все три крупные реализации используют SSO (т.е. "short string optimization"), т.е. когда строка достаточно короткая, она не выделяется в куче, а записывается прямо поверх (некоторых из) этих полей.
Если на какой-то реализации sizeof(std::string) > 3 * sizeof(void *)
, значит они добавили еще дополнительных байт для SSO, которые для длинных строк вообще не используются.