Oggi ho riscontrato un problema con le strutture di Swift. Vedere il seguente struct per esempio:Swift calcola la dimensione errata della struttura
struct TestStruct {
var test: UInt16
var test2: UInt32
}
presumo che la dimensione di questa struct in totale è di 6 byte, perché UInt16 è 2 byte e UInt32 è 4 byte grande.
stampe il seguente codice 6 (che è corretto):
println(sizeof(UInt32) + sizeof(UInt16))
Ma se controllo la dimensione della struttura con
println(sizeof(TestStruct))
esso stampa 8 e non 6.
Se provo lo stesso con la seguente struttura:
struct TestStruct2 {
var test: UInt16
var test2: UInt16
var test3: UInt16
}
Poi
println(sizeof(TestStruct2))
stampa il valore corretto: 6. Ma la dimensione del TestStruct dovrebbe essere lo stesso come la dimensione della TestStruct2.
Perché la prima struct 8 byte è grande? Sto facendo qualcosa di sbagliato o si tratta di un bug?
(testato con Xcode 6.1.1 (6A2008a) su OS X Mavericks, comando normale applicazione linea per Mac)
Google "struct alignment" e vedrai il motivo. È un comportamento generale. Ad esempio: https://msdn.microsoft.com/en-us/library/71kf49f1.aspx –
Confronta http://stackoverflow.com/questions/28898277/why-does-some-types-float80-have-a- memory-allineamento-grande-che-word-size. –
Grazie per avermi indicato nella giusta direzione! Non ero a conoscenza di questo, mi dispiace. Sono ancora nuovo per linguaggi di livello inferiore come C e Objective-C. Ma poi, come posso ottenere dati da NSData in questa struttura allineata? Se utilizzo data.getBytes (e aStruct, length: sizeof (AStruct)), ho valori errati. – user4650218