Pergunta

Estou armazenando algumas classes com parâmetros amplos descrevendo -os (como nome, descrição e outros). Agora, se eu mudar todas essas widestrings para "string" simples (estou usando alias, então tenho que mudar apenas uma linha), o uso da memória é cerca de 5% maior !! do que anteriormente ... como isso é possível, já que cada char da corda é duas vezes menor que o Widechar?

desde já, obrigado!

m.

Foi útil?

Solução

O Delphi Memory Manager não libera toda a memória não utilizada para o sistema operacional. A fragmentação também pode começar muito mal. Ambos dependem do gerenciador de memória real que você usa (o Fastmm geralmente é melhor que o gerenciador de memória de ações no D7, mas qualquer gerenciador de memória pode ser trazido de joelhos usando uma série específica do gerenciador de memória de padrões de uso de memória). Além disso, as amplificações, embora sejam seqüências de caracteres, não são contadas de referência e podem não ser liberadas ainda mais tarde que as cordas normais.

A única maneira confiável de consultar a mensagem de memória real em Delphi é perguntar ao gerenciador de memória que seu programa Delphi usa. Esta função na unidade do sistema faz isso para você:

function GetHeapStatus: THeapStatus

--Jeroen

EDIT: 20100104 em reação a comentar por Marco: (Fastmm geralmente é melhor que o gerenciador de memória de ações no D7, mas qualquer gerente de memória pode ser trazido de joelhos usando uma série específica de uso de memória de padrões de uso de memória)

Outras dicas

É possível porque essas cordas quase certamente constituem uma parte (relativamente) pequena da memória usada para executar seu programa. Outro espaço é usado por alças, vários objetos, etc.

Para fins de exemplo, vamos supor que você tenha cerca de 100kb de texto ao usar strings ANSI e você o converte em Wideestrings. Somente esses 100kb seriam afetados, mas esses 100kb não constituem todos os bytes da pegada de memória do seu programa. O espaço será usado para formulários, alças, números e outros objetos, mas como eles não estão sendo alterados na conversão, obviamente não exigirão mais memória do que antes da conversão.

Os wideestrings usam um gerenciador de memória diferente (um Windows) e depois o Ansistrings (Delphi's) e são contados de referência diferentes. Como você mediu o uso da memória? Com que ferramenta e qual contador exato?

Como você mede as memórias usadas? A memória wideestring do IIRC é alocada usando SysAllocString () e, assim, ignora o Delphi Memory Manager.

O Memory Manager em Delphi sempre tem mais memória, do que realmente precisa. É uma melhoria de velocidade.

Você está usando o tipo Ansistring ou Shortstring quando não estiver usando o WideString? É possível que você esteja compilando com {$ H–} sinalizador do compilador (globalmente ou em alguma unidade) que trata todos os tipos de "string" como curta? Se suas cordas forem do tipo curto e você não especificar o tamanho da string, a memória alocada é sempre 256 bytes.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top