La memoria para la cadena puede o no estar dentro de la clase string
. Posible (y probablemente), la clase string
administrará su propia memoria, teniendo solo un puntero a la memoria utilizada para almacenar los datos. Ejemplo:
struct Airlane {
String Name {
char *data; // size = 4
size_t size; // size = 4
}
int diameter; // size = 4
int weight; // size = 4
}; // size = 16
Tenga en cuenta que esos no son necesariamente tamaños reales, son solo por ejemplo.
También tenga en cuenta que en C++ (a diferencia de C, por ejemplo), para cada class T
, sizeof T
es una constante de tiempo de compilación, lo que significa que los objetos nunca pueden tener tamaño dinámico. Esto significa en efecto: tan pronto como necesite datos de tamaño dinámico de tiempo de ejecución, tiene que haber áreas de memoria externas (por ejemplo, el objeto). Esto puede implicar el uso de contenedores estándar como std::string
o std::vector
, o incluso recursos gestionados manualmente.
Esto a su vez significa, operator new
no necesita saber el tamaño dinámico de todos los miembros, de forma recursiva, pero sólo el tamaño de la clase más externa, la que se puede asignar. Cuando esta clase externa necesita más memoria, tiene que administrarla por sí misma. Algunos ejemplares de p-código:
Airline* myPlane = new Airline {
Name = {
data = new char[some-size]
...
}
...
}
Las asignaciones internas son realizadas por los constructores de retención:
Airline::Airline() : string(), ... {}
string::string() : data(new char[...] ... {}
operator new
no hace más que asignar algo de memoria de tamaño fijo como el "suelo" de Airline
(ver primer p-code), y luego "seeds" Airline
s constructor, que a su vez tiene que administrar su tiempo de vida en ese volumen restringido de "suelo", invocando el constructor de cadenas (implícita o explícitamente), que hace otro new
.
mi conjetura, sin saber C++, es que almacena solo un puntero a la cadena, cuyos contenidos reales están en algún lugar en el montón. –