2010-01-19 7 views
5
class Animal 
{ 
public: 
    int a; 
    double d; 
    int f(){ return 25;} 
}; 

Supponiamo per il codice precedente, tento di inizializzare un oggetto, dicendo new Animal(), ciò new() allocare anche memoria per la funzione f()?Il nuovo() alloca memoria anche per le funzioni di una classe?

In altre parole, qual è la differenza nei termini di allocazione di memoria se avessi questa classe invece e facesse un new Animal()?:

class Animal 
{ 
public: 
    int a; 
    double d; 
}; 

risposta

3

N. Funzioni esistono nella pagina di testo e quindi nessuno spazio è allocata per loro.

+0

quindi, se la mia funzione è una funzione virtuale (la mia classe è astratta), 'new()' avrà problemi nell'allocazione dello spazio sull'heap? – Moeb

+0

Tutta una funzione virtuale significa che la funzione viene aggiunta al vtable situato nella memoria statica. Esiste solo una copia di un vtable per classe che utilizza funzioni virtuali. –

+0

@Ignacio Sto cercando una risposta a: http://stackoverflow.com/questions/2091426/why-cant-we-create-objects-for-an-abstract-class-in-c Penso che il problema sia qualcosa legato all'assegnazione della memoria, ma non riesco a capirlo. – Moeb

7

Per una classe senza funzioni virtuali, la funzione non occupa spazio dati. Le funzioni sono sezioni di codice che possono essere eseguite per manipolare i dati. Sono i membri dati che devono essere allocati.

Quando si dispone di una classe virtuale, spesso esiste un puntatore aggiuntivo per la tabella virtuale. Si noti che un vtable è un dettaglio specifico dell'implementazione. Anche se la maggior parte dei compilatori li usa, non puoi contare sul fatto che sia sempre lì.

Ho expanded su questa risposta per l'altra domanda.

Problemi correlati