Question

J'ai une grande application delphi et je suis en train de garder l'empreinte mémoire faible.

Dans mon programme, je me sers d'un composant (Taco) et un composant (TBurrito) qui hérite de taco. Maintenant, juste en ce qui concerne l'utilisation de la mémoire des classes et non pas les cas réels, le scénario utilise plus de mémoire?

A. En utilisant simplement le composant TBurrito partout

ou

B. En utilisant une combinaison de composants Taco et TBurrito?

Ma seule pensée est que depuis Taco TBurrito, la classe Taco est déjà stocké dans la mémoire et donc l'utiliser ne sera pas augmenter l'empreinte de mémoire beaucoup.

* Remarque -. Les noms de composants ne sont pas vraiment Taco et burrito

Était-ce utile?

La solution

Chaque instance de Burrito occupera au moins autant de mémoire comme une instance de Taco. Soustraire Taco.InstanceSize de Burrito.InstanceSize pour savoir combien.

En utilisant exclusivement Burrito vous ne sauvera pas de mémoire; la définition de Taco existera toujours, même si vous avez pas de cas de cette catégorie exacte, parce que, à tout le moins, Burrito.ParentClass doit encore s'y référer.

Utilisez le plus petit composant qui permet d'atteindre vos besoins, mais à moins que Burrito est énorme par rapport à Taco ou si vous avez un grand nombre d'instances de Burrito qui pourraient être des instances Taco à la place, vous n'êtes probablement pas va voir beaucoup d'effet global sur votre utilisation de la mémoire. Cela viendra de s'abstenir de formes entières de chargement ou chargement seulement des morceaux d'un fichier au lieu de la chose.

Autres conseils

Les classes utilisent simplement la mémoire pour leurs VMT. Jusqu'à ce que vous par exemple en fait une classe, il n'occupe pas l'espace, mais pour le VMT, et il n'y a qu'un seul VMT pour chaque classe. La taille VMT ne dépend que du nombre de méthodes d'une classe virtuelle a fait, parce qu'il ya une entrée pour chaque méthode virtuelle. Les méthodes statiques sont résolues au moment de la compilation et ne pas utiliser l'espace mémoire. D'autres données sont VMT taille fixe (bien que peut être différent dans une version différente de Delphi). Les méthodes dynamiques ont été introduites pour maintenir VMT plus petits. En effet, héritant d'une classe va créer une nouvelle VMT avec tous les « créneaux horaires » des méthodes virtuelles de la classe parente, plus ceux de la classe héritée. Les méthodes dynamiques utilisent un code de répartition d'exécution à la recherche de la méthode à appeler. Parce qu'ils sont un peu plus lents, leur utilisation a été suggéré que pour les classes qui ont outrepassée quelques méthodes de classes de parents très grandes. Si la mémoire n'est pas un problème, il n'y a pas de raisons de les utiliser. On pourrait aussi utiliser l'espace mémoire sont des informations RTTI, même si je jamais où comment enquêter ils sont stockés. Quoi qu'il en soit, si vous utilisez une classe enfant, son devrait être nécessaire VMT de parent aussi bien, parce que la classe des enfants peut appeler celles héritées. Mais à moins que vous utilisez très grande classe avec beaucoup de méthodes virtuelles et quelques cas, je suppose que la plupart de la mémoire utilisée par votre application sera celle des instances de classe, pas VMT de classe.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top