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

pour le code On suppose ci-dessus, je tente d'initialiser un objet, en disant new Animal(), est-ce new() alloue également la mémoire de la fonction f()?Est-ce que new() alloue de la mémoire pour les fonctions d'une classe?

En d'autres termes, quelle est la différence dans les termes d'allocation de mémoire si j'avais cette classe à la place et a fait un new Animal()?:

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

Répondre

3

N ° Fonctions existent dans la page de texte et donc pas d'espace est alloué pour eux.

+0

Donc, si ma fonction est une fonction virtuelle (ma classe est abstraite), 'new()' aura-t-il des problèmes pour allouer de l'espace sur le tas? – Moeb

+0

Tout un moyen de fonction virtuelle est que la fonction est ajoutée à la vtable située dans la mémoire statique. Il n'y a qu'une seule copie d'un vtable par classe qui utilise des fonctions virtuelles. –

+0

@Ignacio Je cherche une réponse à: http://stackoverflow.com/questions/2091426/why-cant-we-create-objects-for-an-abstract-class-in-c Je pense que le problème est quelque chose lié à l'allocation de la mémoire, mais je ne peux pas le comprendre. – Moeb

7

Pour une classe sans fonctions virtuelles, la fonction elle-même n'occupe aucun espace de données. Les fonctions sont des sections de code pouvant être exécutées pour manipuler des données. Ce sont les membres de données qui doivent être alloués.

Lorsque vous avez une classe virtuelle, il existe souvent un pointeur supplémentaire pour la table virtuelle. Notez qu'un vtable est un détail spécifique à l'implémentation. Bien que la plupart des compilateurs les utilisent, vous ne pouvez pas toujours compter sur eux. Je ai expanded sur cette réponse sur votre autre question.

Questions connexes