¿Por qué sizeof (string) == 32?

¿Cuál es la sobrecarga en la estructura de cuerdas que causa que sizeof () sea 32?

Algunas implementaciones de std::string ahorran cadenas muy pequeñas directamente en la stack en una matriz de caracteres de tamaño estático en lugar de usar almacenamiento de almacenamiento dynamic dynamic. Esto permite evitar asignaciones de montón para muchos objetos de cadena pequeños y mejora la localidad de referencia.

Además, habrá un miembro std::size_t para guardar el tamaño de las cadenas y un puntero (potencialmente no utilizado, ver arriba) para el almacenamiento del montón.

std::string normalmente contiene un búfer para la “optimización de cadena pequeña” — si la cadena es menor que el tamaño del búfer, entonces no se requiere asignación de stack.

Mi suposicion es:

 class vector { char type; struct Heap { char* start; char* end; char* allocatedEnd; }; struct Stack { char size; char data[27]; } union { Stack stackVersion; Heap heapVersion; } version; }; 

Pero apuesto a que hay cientos de formas de hacerlo.

Depende de la biblioteca. No debe confiar en el tamaño de std::string objetos std::string porque es probable que cambie en diferentes entornos (obviamente entre diferentes proveedores de bibliotecas estándar, pero también entre diferentes versiones de la misma biblioteca).

Tenga en cuenta que std::string implementaciones de std::string están escritas por personas que han optimizado para una variedad de casos de uso, lo que generalmente lleva a 2 representaciones internas, una para cadenas cortas (pequeño búfer interno) y otra para cadenas largas (memoria externa externa asignada en el montón) ) La sobrecarga está asociada a la celebración de ambos dentro de cada objeto std::string .

En g ++ 5.2 (en por ejemplo, g ++ 4.9, es diferente), una cadena se define básicamente como:

 class string { char* bufferp; size_t length; union { char local_buffer[16]; size_t capacity; }; }; 

En una computadora común, esto sum 32 bytes (8 + 8 + 16).

La definición real es, por supuesto,

 typedef basic_string string; 

Pero la idea es la misma.

P: ¿Por qué es un perro amarillo? R: No es necesariamente.

El tamaño de un objeto std :: string (an?) Depende de la implementación. Acabo de comprobar MS VC ++ 2010. Efectivamente usa 32 bytes para std :: string. Hay una unión de 16 bytes que contiene el texto de la cadena, si cabe, o un puntero para acumular el almacenamiento de cadenas más largas. Si los implementadores hubieran elegido mantener cadenas de 18 bytes en el objeto de cadena en lugar de en el montón, el tamaño sería de 34 bytes. Los otros 16 bytes comprenden una tara, que contiene cosas tales como la longitud de la cadena y la cantidad de memoria asignada actualmente para la cadena.

Una implementación diferente siempre podría asignar memoria desde el montón. Dicha implementación indudablemente requerirá menos memoria para el objeto de cadena.