Я хотел бы получить байты a std::string
строка занимает в памяти, а не количество символов. Строка содержит многобайтную строку. Будет ли std::string::size()
сделать это для меня?
EDIT: Кроме того, size()
также включает завершающий NULL
?
Я хотел бы получить байты a std::string
строка занимает в памяти, а не количество символов. Строка содержит многобайтную строку. Будет ли std::string::size()
сделать это для меня?
EDIT: Кроме того, size()
также включает завершающий NULL
?
std::string
работает на байтах, а не на символах Unicode, поэтому std::string::size()
действительно вернет размер данных в байтах (без накладных расходов, которые std::string
должен хранить данные, конечно).
Нет, std::string
хранит только данные, которые вы указываете для хранения (для этого не нужен символ NULL
). Таким образом, он не будет включен в размер, если вы явно не создадите строку с завершающим символом NULL
.
std::string::size()
действительно является размером в байтах.
Вы можете быть педантичным:
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);
Чтобы получить объем используемой строки, вам придется суммировать capacity()
с накладными расходами, используемыми для управления. Обратите внимание, что это capacity()
, а не size()
. Емкость определяет количество выделенных символов (charT
), а size()
указывает, сколько из них действительно используется.
В частности, реализации std::string
обычно не содержат * shrink_to_fit * содержимое, поэтому, если вы создаете строку и затем удаляете элементы с конца, size()
будет уменьшаться, но в большинстве случаев (это реализация ) capacity()
не будет.
Некоторые реализации могут не выделять точный объем требуемой памяти, а скорее получать блоки данных размеров для уменьшения фрагментации памяти. В реализации, которая использовала мощность двухразмерных блоков для строк, строка с размером 17
могла выделять целых 32
символов.
Да, размер() даст вам число char
в строке. Один символ в многобайтовом кодировании занимает несколько char
.