Home Page
Articoli
Tips & Tricks
News
Forum
Archivio Forum
Blogs
Sondaggi
Rss
Video
Utenti
Chi Siamo
Contattaci
Username:
Password:
Login
Registrati ora!
Recupera Password
Home Page
Stanze Forum
.NET Framework
C# - struct allocata nello stack
mercoledì 09 maggio 2007 - 10.12
Elenco Threads
Stanze Forum
Aggiungi ai Preferiti
Cerca nel forum
MaxKind
Profilo
| Newbie
2
messaggi | Data Invio:
mer 9 mag 2007 - 10:12
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
7.999
messaggi | Data Invio:
mer 9 mag 2007 - 13:19
>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
2
messaggi | Data Invio:
mer 9 mag 2007 - 13:39
Credo che la tua spiegazione (suffragata dalla documentazione di riferimento) sia plausibile.
Grazie per il tempo speso e complimenti per la celerità.
Torna su
Stanze Forum
Elenco Threads
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 !