Inoltre, è possibile ridurre lo spreco di memoria "ordinando" i campi in modo che le loro posizioni in memoria risultino allineate per bytes. Tutti gli elementi di una struttura in genere vengono allineati a indirizzi multipli di 4. Fanno eccezione a questa regola: Char, Short e UShort, che vengono allineati a indirizzi multipli di 2; Byte e SByte, che non vengono allineati. Volendo fare un esempio, la struttura che segue occupa 24 bytes:
Structure Esempio Dim B1 As Byte 'Offset 0 ; Grandezza 1 byte Dim I1 As Integer 'Offset 4 ; Grandezza 4 bytes Dim B2 As Byte 'Offset 8 ; Grandezza 1 byte Dim I2 As Integer 'Offset 12 ; Grandezza 4 bytes Dim C1 As Char 'Offset 16 ; Grandezza 1 byte Dim I3 As Integer 'Offset 20 ; Grandezza 4 bytes 'Totale: 24 bytes End Structure
Tuttavia, seguendo le regole summentovate, è possibile riorganizzare il contenuto della struttura, andando a posizionare i valori più piccoli vicini, per riempire spazio, mentre quelli più grandi alla fine:
Structure Esempio Dim B1 As Byte 'Offset 0 ; Grandezza 1 byte Dim B2 As Byte 'Offset 1 ; Grandezza 1 byte Dim C1 As Char 'Offset 2 ; Grandezza 1 byte Dim I1 As Integer 'Offset 4 ; Grandezza 4 bytes Dim I2 As Integer 'Offset 8 ; Grandezza 4 bytes Dim I3 As Integer 'Offset 12 ; Grandezza 4 bytes End Structure
Il procedimento illustrato si può riassumere in uno schema come segue:
Con le classi, questa ottimizzazione manuale non è necessaria, poichè il compilatore è in grado di sistemare manualmente i campi in modo da ottenere il massimo risparmio di spazio. Con le strutture, è invece possibile utilizzare l'attributo StructuLayout, definito nel namespace System.Runtime.InteropServices:
<StructLayout(LayoutKind.Auto)> _ Structure Esempio '... End Structure
Aggiungi un commento