Ieri sera mi sono letto un articolo di MSDN che ho considerato illuminante rispetto le problematiche di gestione della memoria in ambiente managed. Mi hanno molto impressionato i benefici che una attenta applicazione di alcune regole può portare in termini di utilizzo della memoria. Vorrei riportare un esempio limpido di questo, direttamente tratto dall'articolo in questione:

// Struttura 1 ****

struct BadValueType
{
    
char c1;
    
int i;
    
char c2;
}

// Struttura 2 ****

struct GoodValueType
{
    
int i;
    
char c1;
    
char c2;
}

Le due strutture riportate nel riquadro possono apparire del tutto uguali, se non fosse per il diverso ordine dei membri. Andando ad analizzare però la dimensione fisica in memoria ci si renderà conto che mentre la prima, occupa 12 bytes, la seconda si accontenta di 8.

La soluzione del mistero sta nel problema dell'allineamento in memoria dei bytes. La struttura 1, avrà 2 bytes per il char, due bytes di padding a 4° byte, 4 byte per l'int, altri due bytes per il secondo char e infine un altro padding al 4° byte. In totale 12 bytes. Nel secondo caso invece avremmo 4 byte per l'int, e consecutivamente 2+2 bytes contigui per i char che tra loro non necessitano di padding.

Se il risparmio di 4 bytes può risultare una banalità, proviamo ad immaginare cosa succederebbe se questa struct facesse parte di una collection di centinaia di elementi. Il risparmio ammonta a 1KB ogni 256 elementi. Non male per aver solo invertito due membri in una struct.

L'articolo completo lo si può trovare a: http://msdn.microsoft.com/msdnmag/issues/05/01/MemoryOptimization/default.aspx

powered by IMHO