Pregunta

Estoy almacenando algunas clases con parámetros WideString describirlos (como nombre, descripción y algunos otros). Ahora si cambio de todos esos WideStrings a simple "cadena" (estoy usando el alias de hecho, así que tengo que cambiar una línea única), el uso de memoria es de un 5% más grande !! de lo que se ... ¿Cómo es posible, ya que cada carbón de la cadena es dos veces más pequeño que el WideChar?

gracias de antemano!

m.

¿Fue útil?

Solución

El administrador de memoria de Delphi no libera toda la memoria no utilizada en el sistema operativo. La fragmentación también puede patear en muy mal. Ambos dependen del administrador de memoria real que se utiliza (FastMM es generalmente mejor que el administrador de memoria de valores en D7, pero cualquier administrador de memoria puede ser llevado a ella de rodillas mediante el uso de una serie específica administrador de memoria de los patrones de uso de memoria). Por otra parte, WideStrings, aunque son COM cadenas, no son referencia contados, y podrían no ser liberados, incluso más tarde de las cadenas normales.

La única manera confiable de consulta mensaje de memoria real en Delphi es pedir al administrador de memoria que utiliza su programa de Delphi. Esta función en la unidad del sistema lo hace por usted:

function GetHeapStatus: THeapStatus

- Jeroen

editar: 20100104 en reacción al comentario de Marco: (FastMM es generalmente mejor que el administrador de memoria de valores en D7, pero cualquier administrador de memoria puede ser llevado a ella de rodillas mediante el uso de una serie específica administrador de memoria de los patrones de uso de memoria)

Otros consejos

Es posible porque esas cadenas es casi seguro que constituyen un (relativamente) pequeña parte de la memoria utilizada para ejecutar el programa. Otro espacio es utilizado por las manijas, diversos objetos, etc.

Por el bien de ejemplo, supongamos que tiene unos 100 KB de texto cuando se utilizan cadenas ANSI y convertirlo en Widestrings lugar. Sólo aquellos 100KB se vería afectada, pero los 100KB no constituyen cada byte de la huella de la memoria del programa. El espacio será utilizado para las formas, las manijas, números y otros objetos, sino porque no se están cambiando en la conversión, es evidente que no se requieren más memoria de la que antes de la conversión.

WideStrings utilizar un gestor de memoria diferentes (una ventana de uno), entonces AnsiStrings (Delphi) y son contados referencia diferente. ¿Cómo se mide el uso de la memoria? ¿Con qué herramientas y qué exacta mostrador?

¿Cómo se mide memoria utilizada? memoria IIRC WideString es asignada usando SysAllocString () y de ese modo de derivación el administrador de memoria Delphi.

Administrador de memoria en Delphi siempre tienen más memoria, de lo que realmente necesita. Es tal mejora de la velocidad.

¿Está utilizando AnsiString o ShortString tipo cuando no utilice el WideString? ¿Es posible que se compila con $ {H} bandera compilador (de forma global o en alguna unidad) que regulase todo tipo "String" como ShortString? Si las cuerdas son de tipo ShortString y que no especifican el tamaño de la cadena a continuación, la memoria asignada es siempre de 256 bytes.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top