length ejemplos array c++ string multibyte

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.