Estoy tratando de entender qué tipo de memoria golpearé al crear una gran variedad de objetos. Sé que cada objeto, cuando se cree, tendrá espacio en el HEAP para las variables miembro, y creo que todo el código para cada función que pertenece a ese tipo de objeto existe en el segmento de código en la memoria, de forma permanente.En C++, ¿en qué memoria están las funciones de clase?
¿Es correcto?
Así que si creo 100 objetos en C++, puedo estimar que necesitaré espacio para todas las variables miembro que posee ese objeto multiplicado por 100 (posibles problemas de alineación aquí), y luego necesito espacio en el segmento de código para una sola copia del código para cada función miembro para ese tipo de objeto (no 100 copias del código).
¿Las funciones virtuales, el polimorfismo, el factor de herencia en esto de alguna manera?
¿Qué pasa con los objetos de bibliotecas vinculadas dinámicamente? Supongo que los dlls obtienen sus propios segmentos de pila, montón, código y datos.
ejemplo simple (no puede ser sintácticamente correcta):
// parent class
class Bar
{
public:
Bar() {};
~Bar() {};
// pure virtual function
virtual void doSomething() = 0;
protected:
// a protected variable
int mProtectedVar;
}
// our object class that we'll create multiple instances of
class Foo : public Bar
{
public:
Foo() {};
~Foo() {};
// implement pure virtual function
void doSomething() { mPrivate = 0; }
// a couple public functions
int getPrivateVar() { return mPrivate; }
void setPrivateVar(int v) { mPrivate = v; }
// a couple public variables
int mPublicVar;
char mPublicVar2;
private:
// a couple private variables
int mPrivate;
char mPrivateVar2;
}
Acerca de la cantidad de memoria deben 100 objetos asignados dinámicamente de tipo Foo tomar incluyendo espacio para el código y todas las variables?
Su hipótesis "Si el objeto tiene asignación automática (pila), también lo harán sus miembros de datos" no es correcto. Tome un std :: vector que se declara como una variable de pila. Si inserta nuevos valores en el vector, los asignará en el montón, no en la pila – newgre
Es por eso que también dije en mi respuesta "Si un objeto asignado a la pila contiene un puntero u otro tipo que luego se usa para asignar en el montón, esa asignación se producirá en el montón independientemente de dónde se creó el objeto en sí ". std :: vector comúnmente se implementa como que contiene tres punteros. –
tienes razón, malentendí tu publicación – newgre