C# - struct allocata nello stack

mercoledì 09 maggio 2007 - 10.12

MaxKind Profilo | Newbie

structCurrencyStruct
{
public long Dollars;
public byte Cents;
}

perché il sizeof di "CurrencyStruct" dà come risultato 16 byte anziché 12?
(long = 8 byte, + byte = 1 byte di cui l'allineamento a DWORD alloca cmq a 4 byte)

Grazie anticipatamente per la risposta.

Brainkiller Profilo | Guru

>perché il sizeof di "CurrencyStruct" dà come risultato 16 byte
>anziché 12?
>(long = 8 byte, + byte = 1 byte di cui l'allineamento a DWORD
>alloca cmq a 4 byte)

Ciao,
ti rimando alla lettura di questi due documenti:
http://msdn2.microsoft.com/en-us/library/aa289521.aspx
http://msdn2.microsoft.com/en-us/library/k69kzbs1.aspx

In particolare:

"Memory Consumption. As with all composite data types, you cannot safely calculate the total memory consumption of a structure by adding together the nominal storage allocations of its members."

e:

"Because structures are value types, a structure variable consumes at least the sum of the memory requirements of its data members. (Packing and alignment by the common language runtime can slightly increase the storage size.)"

Magari dico una stupidata, ma facendo qualche test pare che il CLR prenda il tipo di dati della struttura più grande (come storage) e lo moltiplichi per creare ulteriore spazio per contenere gli altri membri.

Esempio la tua struttura:

long (8 byte)
byte (1 byte)

la struttura completa occupa 16. Cioè 8 per il long, 1 per il byte, e gli altri vuoto.
Se tu provi con una struttura con:

int (4 byte)
byte (1 byte)

la struttura completa occupa 8. Cioè 4 per l'int, 1 per il byte, e 3 vuoti.

Se invece provi con:

byte (1byte)
byte (1byte)
byte (1byte)
byte (1byte)
byte (1byte)
int (4 byte)

la struttura completa occupa diciamo un valore multiplo di 4 che possa contenere anche 5 byte quindi 12.
Ergo dei 12, 4 occupati dall'int, 5 dai 5 byte e 3 vuoti.

Se in questo ultimo esempio usi un long invece di un int la struttura occuperà 16 visto che negli altri 8 possono essere contenuti i 5 byte.
Ciao

David De Giacomi | Microsoft MVP
http://blogs.dotnethell.it/david/

MaxKind Profilo | Newbie

Credo che la tua spiegazione (suffragata dalla documentazione di riferimento) sia plausibile.

Grazie per il tempo speso e complimenti per la celerità.
Partecipa anche tu! Registrati!
Hai bisogno di aiuto ?
Perchè non ti registri subito?

Dopo esserti registrato potrai chiedere
aiuto sul nostro Forum oppure aiutare gli altri

Consulta le Stanze disponibili.

Registrati ora !
Copyright © dotNetHell.it 2002-2024
Running on Windows Server 2008 R2 Standard, SQL Server 2012 & ASP.NET 3.5