Sto provando a capire che tipo di memoria viene colpita creando una vasta gamma di oggetti. So che ogni oggetto - una volta creato - avrà spazio nello HEAP per le variabili membro, e penso che tutto il codice per ogni funzione che appartiene a quel tipo di oggetto esista nel segmento di codice in memoria - permanentemente.In C++, dove sono messe in memoria le funzioni di classe?
È giusto?
Quindi, se posso creare 100 oggetti in C++, posso stimare che avrò bisogno di spazio per tutte le variabili membro quell'oggetto possiede moltiplicato per 100 (problemi possibili di allineamento qui), e poi ho bisogno di spazio nel segmento di codice per una singola copia del codice per ogni funzione membro per quel tipo di oggetto (non 100 copie del codice).
Le funzioni virtuali, il polimorfismo, il fattore ereditari in questo in qualche modo?
E gli oggetti provenienti da librerie collegate dinamicamente? Presumo che le DLL ottengano i propri segmenti stack, heap, codice e dati.
esempio semplice (potrebbe non essere sintatticamente corretto):
// 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;
}
Circa la quantità di memoria dovrebbero 100 oggetti allocati dinamicamente di tipo Foo prendere compreso spazio per il codice e tutte le variabili?
Presupposto "Se l'oggetto dispone di allocazione automatica (stack), anche i relativi membri dati" non sono corretti. Prendi un vettore std :: che è dichiarato come variabile stack. Se si inseriscono nuovi valori nel vettore, verranno allocati nell'heap, non nello stack – newgre
Questo è il motivo per cui ho anche detto nella mia risposta "Se un oggetto allocato allo stack contiene un puntatore o un altro tipo che viene quindi utilizzato per allocare sull'heap, quell'allocazione si verificherà nell'heap indipendentemente da dove è stato creato l'oggetto stesso. " std :: vector è comunemente implementato come contenente tre puntatori. –
hai ragione, ho frainteso il tuo post – newgre