Получение неверного размера строки - PullRequest
0 голосов
/ 31 января 2020

Когда я пытаюсь проверить размер строки, я получаю значение 28, когда использую функцию

std::cout<<sizeof(std::string);

Разве размер не должен быть 4 байта в 32-битной системе? Я использую Visual Studio 2019

Я думал, что строка - это указатель на символ, поэтому размер будет 4 байта в 32-битной системе.

Ответы [ 2 ]

6 голосов
/ 31 января 2020

Разве размер не должен быть 4 байта в 32-битной системе?

Нет. Размер std::string не определен языковым стандартом. Он может варьироваться в зависимости от реализации, и в 32-битной системе не требуется и не гарантируется, что он составляет 4 байта.

Получение неверного размера строки

28 байтов не является "Неверный", и это ни в коем случае не является необычным.

Я думал, что строка является указателем на символ

std::string не указатель. Это класс, который реализует более сложную структуру данных, чем эта.

0 голосов
/ 01 февраля 2020

Это зависит от компилятора, размера целевого слова и версии стандартной библиотеки.

В системах до C ++ 11 было возможно (и довольно распространено) для std :: string to использовать механизмы копирования при записи (CoW). В этом случае я думаю, что реализации будут просто содержать указатель на объект реализации строки.

Пост C ++ 11, CoW был запрещен , а также стандарт требует std :: string :: length (), чтобы быть постоянным временем. Это последнее требование фактически обязывает реализации строк содержать по крайней мере указатель и поле длины. Добавьте к этому необходимость в «зарезервированном» поле (поскольку у std::string может быть зарезервировано больше памяти, чем используется).

Вот несколько хороших ссылок на тему C ++ 11 и более поздних версий. std :: strings:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...