Domanda

Sono la memorizzazione di alcune classi con parametri WideString descrivendoli (come il nome, la descrizione e alcuni altri). Ora, se cambio tutte quelle WideStrings al semplice "stringa" (sto usando alias in realtà così devo cambiare una sola riga), l'utilizzo della memoria è più grande circa il 5% !! rispetto al passato ... Come è possibile, dal momento che ogni carattere della stringa è due volte più piccolo del WideChar?

grazie in anticipo!

m.

È stato utile?

Soluzione

Il gestore di memoria Delphi non rilascia tutta la memoria non utilizzata per il sistema operativo. La frammentazione può anche calciare in molto male. Entrambi dipendono sul gestore di memoria effettiva si utilizza (FastMM di solito è meglio che il gestore di magazzino della memoria a D7, ma qualsiasi gestore di memoria può essere portato al suo ginocchio utilizzando un gestore di memoria specifica serie di modelli di utilizzo della memoria). Inoltre, WideStrings, anche se sono stringhe COM, non sono di riferimento contati, e non potrebbero essere rilasciati anche più tardi rispetto alle stringhe normali.

L'unico modo affidabile per interrogare messaggio memoria effettiva in Delphi è quello di chiedere al gestore di memoria il programma di Delphi usa. Questa funzione nell'unità di sistema che fa per voi:

function GetHeapStatus: THeapStatus

- Jeroen

modifica: 20100104 in reazione a lasciare un commento di Marco: (FastMM di solito è meglio che il gestore di magazzino della memoria a D7, ma qualsiasi gestore di memoria può essere portato al suo ginocchio utilizzando un gestore di memoria specifica serie di modelli di utilizzo della memoria)

Altri suggerimenti

E 'possibile perché quelle stringhe costituiscono quasi certamente un (relativamente) piccola parte della memoria utilizzata per eseguire il programma. Altro spazio è utilizzato da maniglie, vari oggetti, ecc.

Per motivi di esempio, supponiamo di avere circa 100 KB di testo quando si utilizzano le stringhe ANSI e si converte al Widestrings invece. Solo quelli 100KB sarebbero colpiti, ma quei 100 KB non costituiscono ogni singolo byte di occupazione di memoria del programma. Spazio verrà utilizzato per le forme, maniglie, numeri e altri oggetti, ma perché non vengono modificate nella conversione, che ovviamente non richiede più memoria rispetto a prima della conversione.

WideStrings usa un gestore di memoria differente (finestre una) allora AnsiStrings (Delphi di) e sono riferimento conteggiato differenti. Come hai fatto a misurare l'utilizzo della memoria? Con quale strumento e quale contatore esatto?

Come si misura memoria utilizzata? memoria IIRC WideString è allocata mediante SysAllocString () e quindi bypassare il gestore di memoria Delphi.

Memory Manager in Delphi prendere sempre più memoria, di quello che ha davvero bisogno. È tale miglioramento della velocità.

Si sta utilizzando AnsiString o il tipo ShortString quando non si utilizza il WideString? E 'possibile che si sta compilando con {$ H-} flag di compilazione (sia a livello globale o in qualche unità), che tratta tutti i tipi "String", come ShortString? Se le stringhe sono di tipo ShortString e non si specifica la dimensione della stringa, allora la memoria allocata è sempre di 256 byte.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top