c++ - ejemplos - Obtener el tamaño de una cadena std:: string en bytes
string size c++ (6)
Existe un conflicto inherente en la pregunta, ya que está escrito: std::string
se define como std::basic_string<char,...>
, es decir, su tipo de elemento es char
(1-byte), pero más tarde usted declaró "the la cadena contiene una cadena multibyte "(" multibyte "== wchar_t
?).
La función miembro size()
no cuenta un valor nulo final. Su valor representa el número de caracteres (no bytes).
Suponiendo que pretendía decir que su cadena de varios bytes es std::wstring
(alias para std::basic_string<wchar_t,...>
), la huella de memoria para los caracteres de std::wstring
, incluido el terminador nulo es:
std::wstring myString;
...
size_t bytesCount = (myString.size() + 1) * sizeof(wchar_t);
Es instructivo considerar cómo se escribiría una función de plantilla reutilizable que funcionaría para CUALQUIER posible instanciación de std :: basic_string <> como esto **:
// 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);
}
** Por simplicidad, ignora los rasgos y los tipos de asignadores raramente especificados explícitamente para std::basic_string<>
(tienen valores predeterminados).
Me gustaría obtener los bytes que ocupa una cadena std::string
en la memoria, no el número de caracteres. La cadena contiene una cadena multibyte. ¿ std::string::size()
haría esto por mí?
EDITAR: También, ¿ size()
también incluye el NULL
terminación?
Para obtener la cantidad de memoria en uso por la cadena, tendría que sumar la capacity()
con la sobrecarga utilizada para la administración. Tenga en cuenta que es la capacity()
y no el size()
. La capacidad determina la cantidad de caracteres (caracteres) asignados, mientras que el size()
le indica cuántos de ellos están realmente en uso.
En particular, std::string
implementaciones de std::string
no suelen * shrink_to_fit * el contenido, por lo que si crea una cadena y luego elimina los elementos del final, el size()
disminuirá, pero en la mayoría de los casos (esto se define en la implementación) capacity()
no lo hará.
Es posible que algunas implementaciones no asignen la cantidad exacta de memoria requerida, sino que obtengan bloques de tamaños dados para reducir la fragmentación de la memoria. En una implementación que utiliza la potencia de bloques de dos tamaños para las cadenas, una cadena con un tamaño 17
podría asignar hasta 32
caracteres.
Podrías ser pedante al respecto:
std::string x("X");
std::cout << x.size() * sizeof(std::string::value_type);
Pero std :: string :: value_type es char y sizeof (char) se define como 1.
Esto solo es importante si escribe el tipo de cadena (porque puede cambiar en el futuro o por las opciones del compilador).
// 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);
Sí, size () te dará el número de caracteres en la cadena. Un carácter en la codificación multibyte toma múltiples caracteres.
std::string::size()
es de hecho el tamaño en bytes.
std::string
opera en bytes, no en caracteres Unicode, por lo que std::string::size()
devolverá el tamaño de los datos en bytes (sin la sobrecarga que std::string
necesita para almacenar los datos, por supuesto ).
No, std::string
almacena solo los datos que le indica que almacene (no necesita el carácter NULL
final). Por lo tanto, no se incluirá en el tamaño, a menos que cree explícitamente una cadena con un carácter NULL
final.