5 votes

C++ fonction membre et taille de classe

Possible Duplicate:
Pourquoi la taille de la classe dépend-elle uniquement des membres de données et non des fonctions membres ?

Quand j'ai appris l'héritage pour la première fois, mon professeur a fait remarquer que contrairement aux membres de données, les fonctions membres ne modifient pas la taille de la classe. C'est-à-dire que si la classe B hérite de la classe A, la taille de B sera plus grande que celle de A seulement si au moins un membre de données est ajouté, et ne sera pas modifiée en fonction de la quantité de fonctions membres. Est-ce correct ? Si c'est le cas, comment fonctionne ce mécanisme ? Il semble que les deux membres devraient être stockés dans le tas et donc coûter en taille.

Merci, Guy

6voto

Jonathan Wood Points 26443

Les variables membres sont stockées en tant que partie de chaque instance de classe. Mais les fonctions membres ne le sont pas.

Chaque instance d'une classe doit avoir une copie séparée de chaque variable membre. Cela permet à chaque objet d'être unique.

Mais les fonctions membres sont du code. Peu importe le nombre d'instances que vous avez d'une classe particulière, il n'y a absolument aucune raison d'avoir de multiples copies du code. Le même code fonctionne simplement sur les données de l'instance.

Comme le code est différent, le code ne fait pas partie de la taille d'une instance de classe. Et sizeof(myClass) n'inclura pas les octets occupés par le code.

2voto

yattering Points 416

Vous pouvez imaginer qu'appeler une fonction membre myClass.myMethod(x) est similaire à myMethod(myClass, x). Il n'est pas nécessaire que cette fonction existe pour chaque instance de classe. Vous pouvez accéder à cet argument "caché" en utilisant le mot-clé this.

1voto

Heisenbug Points 20496

si la classe B hérite de la classe A, alors la taille de B sera plus grande que celle de A si et seulement si au moins un membre de données est ajouté, et ne sera pas modifiée par rapport à la quantité de membres de fonction.

Oui c'est correct. (si B n'implémente pas d'autres méthodes). Chaque instance de classe a une copie des membres de données et un pointeur vers une table de fonctions membres où ils sont réellement stockés.

Le code des fonctions membres est partagé entre différentes instances de la même classe. Si B ne remplace pas une fonction membre de la classe de base A, A et B peuvent partager les mêmes méthodes. Lorsque vous remplacez une fonction membre dans une sous-classe, vous modifiez essentiellement ce mécanisme, créant une nouvelle définition de la fonction membre remplacée, disponible uniquement pour la sous-classe où vous l'avez définie (par exemple, B).

Normalement, une fonction membre est liée au moment de la compilation. Ainsi, si vous avez une instance de la sous-classe B référencée par l'intermédiaire d'un pointeur vers la classe de base A, et que vous appelez une fonction membre foo() définie dans les deux classes, la fonction appelée sera celle implémentée dans la classe de base. Vous pouvez forcer une fonction membre à être liée au moment de l'exécution en la déclarant virtuelle (la fonction membre appelée sera celle du type réel de la classe pointée via le pointeur de base). Cela entraînera l'utilisation d'une table supplémentaire (table des méthodes virtuelles, vtable) pour stocker les méthodes virtuelles, et une double indirection de pointeur pour chaque appel.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X