Подтвердить что ты не робот

Получить размер строки std::string в байтах

Я хотел бы получить байты a std::string строка занимает в памяти, а не количество символов. Строка содержит многобайтную строку. Будет ли std::string::size() сделать это для меня?

EDIT: Кроме того, size() также включает завершающий NULL?

4b9b3361

Ответ 1

std::string работает на байтах, а не на символах Unicode, поэтому std::string::size() действительно вернет размер данных в байтах (без накладных расходов, которые std::string должен хранить данные, конечно).

Нет, std::string хранит только данные, которые вы указываете для хранения (для этого не нужен символ NULL). Таким образом, он не будет включен в размер, если вы явно не создадите строку с завершающим символом NULL.

Ответ 2

std::string::size() действительно является размером в байтах.

Ответ 3

Вы можете быть педантичным:

std::string x("X");

std::cout << x.size() * sizeof(std::string::value_type);

Но std::string:: значение_type char, а sizeof (char) определяется как 1.

Это становится важным, если вы набираете тип строки (потому что это может измениться в будущем или из-за параметров компилятора).

// Some header file:
typedef   std::basic_string<T_CHAR>  T_string;

// Source a million miles away
T_string   x("X");

std::cout << x.size() * sizeof(T_string::value_type);

Ответ 4

Чтобы получить объем используемой строки, вам придется суммировать capacity() с накладными расходами, используемыми для управления. Обратите внимание, что это capacity(), а не size(). Емкость определяет количество выделенных символов (charT), а size() указывает, сколько из них действительно используется.

В частности, реализации std::string обычно не содержат * shrink_to_fit * содержимое, поэтому, если вы создаете строку и затем удаляете элементы с конца, size() будет уменьшаться, но в большинстве случаев (это реализация ) capacity() не будет.

Некоторые реализации могут не выделять точный объем требуемой памяти, а скорее получать блоки данных размеров для уменьшения фрагментации памяти. В реализации, которая использовала мощность двухразмерных блоков для строк, строка с размером 17 могла выделять целых 32 символов.

Ответ 5

Да, размер() даст вам число char в строке. Один символ в многобайтовом кодировании занимает несколько char.