2011-06-04 25 views

Respuesta

21

std::string opera en bytes, no en caracteres Unicode, por lo que de hecho std::string::size() devolverá el tamaño de los datos en bytes (sin el añadido de que std::string necesita almacenar los datos, por supuesto).

No, std::string almacena solo los datos que le dice que almacene (no necesita el carácter NULL posterior). Por lo tanto, no se incluirá en el tamaño, a menos que cree explícitamente una cadena con un carácter NULL posterior.

+0

¿Es válido decir que std :: string es lo mismo que una matriz de caracteres? ¿O hay diferencias importantes? – rzetterberg

+2

Sí, char array es exactamente lo que 'std :: string' es. Existen algunas diferencias de implementación entre 'std :: string' y' std :: vector ', pero los datos que están almacenando son los mismos. –

+7

solo quiero señalar que el motivo 'std :: string :: size()' no incluye el caracter 'NULL' es seguir la convención establecida por' strlen' que tampoco lo incluye. Las implementaciones reales de 'std :: string' requieren el * almacenamiento * para la terminación' NULL', para implementar el método 'string :: c_str()' con una sobrecarga mínima. Tal vez [esta pregunta] (http://stackoverflow.com/q/4653745) explica mejor que yo. – rwong

2

Sí, size() le dará el número de char en la cadena. Un personaje en codificación multibyte toma múltiples char.

5

std::string::size() es de hecho el tamaño en bytes.

4

Para obtener la cantidad de memoria utilizada por la cadena, debe sumar el capacity() con la sobrecarga utilizada para la administración. Tenga en cuenta que es capacity() y no size(). La capacidad determina la cantidad de caracteres (charT) asignados, mientras que size() le informa cuántos de ellos están realmente en uso.

En particular, std::string implementaciones no suele shrink_to_fit * * el contenido, por lo que si se crea una cadena y luego quitar elementos del final, el size() se decrementa, pero en la mayoría de los casos (esto se define la aplicación) capacity() no lo hará

Algunas implementaciones pueden no asignar la cantidad exacta de memoria requerida, sino más bien obtener bloques de tamaños determinados para reducir la fragmentación de la memoria. En una implementación que usó la potencia de dos bloques de tamaño para las cadenas, una cadena con el tamaño 17 podría estar asignando hasta 32 caracteres.

6

Usted podría 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 sólo llega a ser importante si el typedef tipo de cadena (porque puede cambiar en el futuro o debido a 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); 
Cuestiones relacionadas