Delphi, chaîne vs WideString problème d'utilisation de la mémoire, VCL non-unicode (D7)

StackOverflow https://stackoverflow.com/questions/1992944

Question

Je stocker certaines classes avec des paramètres WideString les décrire (comme le nom, la description et quelques autres). Maintenant, si je change tous les WideStrings à « string » simple (j'utilise alias en fait si je dois changer une seule ligne), utilisation de la mémoire est d'environ 5% plus !! que précédemment ... Comment est-ce possible, puisque chaque caractère de la chaîne est deux fois plus petit que le WideChar?

Merci d'avance!

m.

Était-ce utile?

La solution

Le gestionnaire de mémoire Delphi ne libère pas toute la mémoire inutilisée au système d'exploitation. Fragmentation peut aussi botter très mal. Les deux dépendent du gestionnaire de mémoire réelle que vous utilisez (FastMM est généralement mieux que le gestionnaire de mémoire disponible dans D7, mais tout gestionnaire de mémoire peut être amené à lui à genoux en utilisant un gestionnaire de mémoire série spécifique de modèles d'utilisation de la mémoire). En outre, WideStrings, si elles sont des chaînes COM, ne sont pas le comptage de références, et peuvent ne pas être libérés, même après que les chaînes normales.

Le seul moyen fiable pour interroger un message de mémoire réelle dans Delphi est de demander au gestionnaire de mémoire de votre programme Delphi utilise. Cette fonction dans l'unité du système fait pour vous:

function GetHeapStatus: THeapStatus

- jeroen

edit: 20100104 en réaction à commenter par Marco: (FastMM est généralement mieux que le gestionnaire de mémoire disponible dans D7, mais tout gestionnaire de mémoire peut être portée à ce genoux à l'aide d'un gestionnaire de mémoire série spécifique de modèles d'utilisation de la mémoire)

Autres conseils

Il est possible parce que ces chaînes constituent presque certainement un petit (relativement) une partie de la mémoire utilisée pour exécuter votre programme. Autre espace est utilisé par poignées, objets divers, etc.

Par souci d'exemple, supposons que vous avez sur 100Ko de texte lorsque vous utilisez des chaînes ANSI et vous convertir à la place Widestrings. Seuls ceux 100KB seraient touchés, mais ces 100KB ne constituent pas chaque octet de l'empreinte mémoire de votre programme. L'espace sera utilisé pour les formulaires, les poignées, les nombres et d'autres objets, mais parce qu'ils ne sont pas modifiés dans la conversion, il est évident qu'ils ne nécessitera pas plus de mémoire que avant la conversion.

WideStrings utiliser un gestionnaire de mémoire différente (un windows un) puis AnsiStrings (de Delphi) et le comptage de références différentes. Comment avez-vous mesuré l'utilisation de la mémoire? Avec quel outil et quel compteur exact?

Comment mesurez-vous la mémoire utilisée? IIRC mémoire WideString est allouée en utilisant SysAllocString () et ainsi contourner le gestionnaire de mémoire Delphi.

Gestionnaire de mémoire dans Delphi toujours plus de mémoire, qu'il a vraiment besoin. Il est une telle amélioration de la vitesse.

Utilisez-vous AnsiString ou le type ShortString lorsqu'ils ne sont pas en utilisant le WideString? Est-il possible que vous compilez avec {$ H-} option de compilation (soit globalement ou dans une unité) qui traite tous les types « chaîne » comme ShortString? Si vos chaînes sont de type ShortString et vous ne spécifiez pas la taille de la chaîne, puis la mémoire allouée est toujours 256 octets.

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