Sono sicuro che ci sono strumenti per Windows che possono darti lo stato di una memoria, ma comunque dovresti sviluppare il tuo servizio pensando a questo problema.
Per prima cosa è necessario capire quali sono le allocazioni preformate. Penso che il modo più semplice per farlo sia sovrascrivere gli operatori new ed delete, e da questi nuovi operatori dovresti contare alcune statistiche delle tue allocazioni e quindi chiamare gli operatori new e delete predefiniti del tuo compilatore.
Le statistiche minime che dovresti contare a mio avviso sono il numero di allocazioni delle gamme di blocchi di dimensioni comuni.
ad es. blocchi tra 0 byte a 15 byte, i blocchi tra 16 byte a 32 byte, i blocchi tra 32 byte a 48 byte, ...
È possibile aggiungere anche il numero di assegnazione sequenziale di ciascun intervallo blocchi dimensioni
Dopo aver raccolto questi dati, è possibile ridurre il problema di frammentazione tramite allineando i blocchi alle dimensioni comuni.
La tecnica migliore e semplice per l'allineamento è quello di utilizzare un blocchi che sono potenza di 2.
ad esempio per allineare un numero di vicini numero che dividere per 16, è possibile utilizzare la seguente funzione:
int align(int size)
{
return ((size + 15) & ~0x0000000F);
}
Ovviamente è consigliabile utilizzare le statistiche per selezionare la potenza ottimale di 2 da allineare. L'obiettivo è raggiungere un numero che la maggior parte delle allocazioni raggiungerà in pochi blocchi e nello stesso tempo mantenere ragionevole il sovraccarico dell'allineamento.
Buona fortuna ...
fonte
2009-10-19 15:28:55
+1 allocatore lastra. – user7116
Sostituire il gestore della memoria solo per misurarlo è inutile a meno che non si usi quel gestore della memoria in produzione. Penso che una soluzione migliore sarebbe quella di strumentare l'attuale allocatore di memoria e misurare la sua frammentazione. È possibile eseguire questa operazione racchiudendo le chiamate alloc/gratuite oppure è possibile vedere se il gestore della memoria dispone di hook che è possibile utilizzare. –