Istanza di una classe e occupazione di memoria

di il
4 risposte

Istanza di una classe e occupazione di memoria

Spero di non aver sbagliato sezione. Volevo fare una semplice domanda riguardante l'efficienza nella programmazione ad oggetti. Quando istanzio una classe, cosa viene allocato in memoria? Soltanto le sue variabili o anche le sue funzioni? Chiedo questo perchè ho una lista dove ogni elemento è un'istanza di una classe (uguale per tutti) e mi chiedevo se è più conveniente mettere le numerose funzioni (i metodi) nella classe o altrove (magari globalmente). Se le metto nella classe verranno poi "replicate" in memoria per ogni oggetto? Come funziona?

4 Risposte

  • Re: Istanza di una classe e occupazione di memoria

    Quando crei un oggetto in memoria, allocchi la seguente memoria:

    1) lo spazio per i membri di istanza
    2) un puntatore alla virtual table
    3) spazio di servizio necessario al sistema di gestione della memoria.

    La 'virtual table' e un vettore contenente un puntatore ai metodi della classe di cui puoi fare l'override.
    Il vettore e' statico ed ne esiste almeno uno per ogni classe definita nel programma.

    Poi ci sono altri dettagli che dipendono dal linguaggio di programmazione utilizzato (C++ piuttosto che C#, Python...)

    Al momento, visto che sei alle prime armi, non farti problemi di quanta memoria ti serve. Raramente il problema e' la memoria. Molto spesso il problema e' non aver identificato gli oggetti giusti, o aver sbagliato la modellazione degli oggetti.

    La programmazione ad oggetti e' una filosofia, o piu' correttamente un 'paradigma', che va compreso ed assimilato. Non conviene agirarlo senza aver ben chiari i pro ed i contro che ne derivano dal farlo.
  • Re: Istanza di una classe e occupazione di memoria

    Quindi, se ho capito bene, la funzione di una classe viene allocata una sola volta (a prescindere dal numero delle sue istanze in memoria). Le istanze hanno solo un puntatore a tale funzione (unica in memoria). Dico bene?
  • Re: Istanza di una classe e occupazione di memoria

    Esatto: il descrittore della classe e la virtual table associata sono istanziate un'unica volta, per classe, ovviamente.

    Questo a' una simpatica conseguenza: se date due istanze, ricuperi il puntatore alla classe (ci sono metodi diversi a seconda del linguaggio), i due puntatori possono essere confrontati con l'operatore "==", perche' necessariamente l'indirizzo di memoria deve essere lo stesso se le due istanze appartengono alla stessa classe.
  • Re: Istanza di una classe e occupazione di memoria

    Una funzione non viene mai "allocata": è presente nella sezione CODICE del tuo programma. Il corpo della funzione fisicamente è presente in una sola copia (appunto nella sezione CODICE).
    Il metodo sa su quale istanza sta lavorando perchè in maniera nascosta gli viene passato sempre il puntatore all'istanza (in C++ è il puntatore this).
    Come dice migliorabile, potresti trovarti un vettore di puntatori a funzione, ma non il corpo della funzione.
Devi accedere o registrarti per scrivere nel forum
4 risposte