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

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

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

6 ответов


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

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


вы могли бы быть педантичным об этом:

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);

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


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

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

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


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


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

на size() функция-член не подсчитывает конечное значение null. Это значение представляет собой количество символов (не байтов).

предполагая, что вы намеревались сказать, что ваша многобайтовая строка 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<> (они имеют значения по умолчанию).