7
votes

Taille d'une classe avec 'ce "pointeur

La taille d'une classe sans données de données n'est renvoyée sous forme de 1 octet, même s'il existe un "ceci" implicite déclaré. La taille de la taille ne devrait-elle pas être redevable 4 octets (sur une machine 32 bits)? J'ai rencontré des articles qui ont indiqué que "ce" pointeur n'est pas compté pour calculer la taille de l'objet. Mais je suis incapable de comprendre la raison de cela. De plus, si une fonction de membre est déclarée virtuelle, la taille de la classe est maintenant renvoyée sous forme de 4 octets. Cela signifie que le VPTR est compté pour calculer la taille de l'objet. Pourquoi le VPTR est-il considéré et «ce« pointeur »ignoré pour calculer la taille de l'objet?


4 Réponses :


6
votes

Le Ce pointeur code> n'est pas membre de la classe. C'est juste une construction qui est utilisée dans des procédés appartenant à la classe pour se référer à l'instance actuelle.

Si vous avez une classe comme celle-ci: P>

IntPair* fib12 = new IntPair(89, 144);

cout << IntPair::sum2(fib12);


0 commentaires

4
votes

'Ceci' n'est pas stocké en tant que membre de données dans la classe, il s'agit simplement d'un "pointeur" à l'instance de la classe. Considérez-le comme un «argument caché» transmis à la méthode. En fait, sur les systèmes WIN32, il est souvent adopté dans le registre EXC (pas EAX comme je pensais initialement).

Dès que vous avez une ou plusieurs méthodes virtuelles, votre application nécessite un moyen de stocker les pointeurs sur les méthodes virtuelles. C'est ce qu'on appelle la machine à table, identique à toutes les instances de la même classe. Depuis que vous devez savoir à l'exécution, quelle méthode «explicite» à appeler pour laquelle «méthode virtuelle», un pointeur à la machine à livrer est stocké dans l'instance de classe. Par conséquent, le pointeur à fourtille (ou VPTR) nécessite 4 octets (ou 8 octets sur un système 64 bits).


2 commentaires

Je pensais que c'était passé dans ECX .


Oups, oui tu as raison. EAX est utilisé pour la valeur de retour. (J'ai édité le post)



2
votes

Le ce pointeur n'est pas stocké à l'intérieur de l'objet. Il n'y a pas besoin de faire ça. Vous avez déjà un pointeur ou un objet pour invoquer les fonctions sur. Quant à la taille de 1, la norme C ++ est requise que les objets distincts ont des adresses distinctes.


0 commentaires

-1
votes

La taille d'un pointeur est toujours la taille du type de pointeur requis pour être stockée en mémoire.

Par exemple, si l'adresse de la mémoire d'un Int est 32 bits sur une architecture 64 bits, alors

int A = 10; int * b = & a; taille de (b); // 32 Tailleof (& B); 64


1 commentaires

En plus de la taille de la taille () renvoie le nombre d'octets, pas des bits, la taille de (int *) et la taille de (int **) ne peuvent pas être différentes.