Получить размер строки std :: string в байтах - PullRequest
21 голосов
/ 04 июня 2011

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

РЕДАКТИРОВАТЬ: Кроме того, size() также включает в себя завершающий NULL?

Ответы [ 6 ]

25 голосов
/ 04 июня 2011

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

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

6 голосов
/ 04 июня 2011

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

std::string x("X");

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

Но std :: string :: value_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);
5 голосов
/ 04 июня 2011

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

4 голосов
/ 04 июня 2011

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

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

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

2 голосов
/ 04 июня 2011

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

0 голосов
/ 31 мая 2018

В вопросе есть конфликт, как написано: std::string определяется как std::basic_string<char,...> - то есть тип его элемента char (1 байт), но позже вы заявили, что «строка содержит многобайтовыйstring "(" multibyte "== wchar_t?).

Функция-член size() не считает завершающий ноль.Это значение представляет количество символов (не байтов).

Предполагая, что вы хотели сказать, что ваша многобайтовая строка равна std::wstring (псевдоним для std::basic_string<wchar_t,...>), объем памяти для символов std::wstring,в том числе нулевой терминатор:

std::wstring myString;
 ...
size_t bytesCount = (myString.size() + 1) * sizeof(wchar_t);

Поучительно рассмотреть, как можно написать многократно используемую шаблонную функцию, которая бы работала для ЛЮБОЙ потенциальной реализации std :: basic_string <> следующим образом **:

// Return number of bytes occupied by null-terminated inString.c_str().
template <typename _Elem>
inline size_t stringBytes(const std::basic_string<typename _Elem>& inString, bool bCountNull)
{
   return (inString.size() + (bCountNull ? 1 : 0)) * sizeof(_Elem);
}

** Для простоты игнорирует признаки и типы распределителей, редко указываемые явно для std::basic_string<> (они имеют значения по умолчанию).

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