2009-01-27 4 views
2

Existe-t-il un moyen d'obtenir la taille réelle d'une instance de classe dans Delphi?Taille d'instance de classe récursive dans Delphi

Je sais sur la méthode InstanceSize de la classe TObject mais cette méthode ne s'invoque pas récursive pour les membres de l'objet. Par exemple, disons que nous avons deux classes:

type MyClass1 = class 
    private 
    myVar1 : integer; 
    myVar2 : integer; 
end; 

type MyClass2 = class 
    private 
    myOtherVar1 : integer; 
    myOtherVar2 : MyClass1; 
end; 

pour ce segment de code, MyClass1 sera 12 octets longueur (4 octets pour chaque entier plus 4 pour les frais généraux de classe) et MaClasse2 sera 24 octets lengh (4 octets pour le surdébit de classe, 12 octets pour myOtherVar2 et 4 pour l'entier myOtherVar1). L'utilisation de InstanceSize se traduira par 12 octets pour chacun d'entre eux, puisque myOtherVar2 est interprété comme un pointeur (4 octets) au lieu d'une référence de classe.

Y at-il un moyen d'obtenir la taille totale de la classe, y compris sa référence à d'autres instances de classe?

Répondre

15

Construire un objet MyClass1 et un million de MaClasse2 de telle sorte que chacun des points de MaClasse2 à la même MyClass1.

Combien de mémoire chaque MyClass2 prend-il? 12.000012 octets?

De combien de mémoire dispose une liste circulaire? Infini comme vous pouvez continuer à chasser des pointeurs pour toujours?

Dans les langues avec des pointeurs, une taille de récursive naïf algorithme n'est pas utile en général. Vous devez écrire votre propre algorithme qui incorpore des connaissances sur l'agrégation/la composition, le partage et les références récursives spécifiques à la façon dont vous utilisez les objets.

+0

Ou en d'autres termes: quelle profondeur voulez-vous aller? Si ObjectA fait référence à ObjectB, qui fait référence à ObjectC, qui fait référence à ......., alors quelle est la véritable "utilisation de la mémoire" de ObjectA? –

1

Non ce que vous voulez n'existe pas. Si vous voulez quelque chose comme ça, vous devriez l'écrire vous-même.

1

Il semble que vous vouliez compter la mémoire utilisée par vos objets.

Si vous devez faire, vous pouvez vérifier FastMM fait, et peut-être accrocher votre procédure lorsque des objets de votre type sont créées.

Beaucoup de travail avec un but peu clair; Tu ferais mieux d'avoir une bonne raison avant de commencer.

2

Y at-il un moyen d'obtenir la taille totale de la classe, y compris sa référence à d'autres instances de classe?

Vous venez de le dire. La référence est un pointeur; sa taille est de 4 octets. La valeur renvoyée par InstanceSize est le nombre d'octets alloués pour les données d'instance de la classe. MyOtherVar2 peut être nul, par exemple.

Mais la valeur du pointeur nul occuperait toujours 4 octets de mémoire.

2

Pour connaître la quantité de mémoire utilisée, vous pouvez laisser les objets ne pas être libérés & Laissez FastMM vous indiquer la taille de la fuite.

Questions connexes