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