Dzisiaj napotkałem problem ze strukturą Swift. Patrz następujące struct na przykład:Swift oblicza nieprawidłowy rozmiar struktury
struct TestStruct {
var test: UInt16
var test2: UInt32
}
I że wielkość tej struktury w sumie 6 bajtów jest, ponieważ Uint16 wynosi 2 bajtów i UInt32 wynosi 4 bajty duża.
następujący kod drukuje 6 (która jest poprawna):
println(sizeof(UInt32) + sizeof(UInt16))
Ale gdybym sprawdzić rozmiar struktury z
println(sizeof(TestStruct))
drukuje 8, a nie 6.
Jeśli spróbuję tego samego z następującą strukturą:
struct TestStruct2 {
var test: UInt16
var test2: UInt16
var test3: UInt16
}
Następnie
println(sizeof(TestStruct2))
drukuje poprawną wartość: 6. Ale wielkość TestStruct powinna być taka sama jak wielkość TestStruct2.
Dlaczego pierwsza struktura ma 8 bajtów? Czy robię coś nie tak, czy to błąd?
(test z Xcode 6.1.1 (6A2008a) na OS X Indywidualistów, Zastosowanie linii normalnej polecenie Mac)
Google "wyrównanie struktury", a zobaczysz przyczynę. To ogólne zachowanie. Na przykład: https://msdn.microsoft.com/en-us/library/71kf49f1.aspx –
Porównaj http://stackoverflow.com/questions/28898277/why-does-some-types-float80-have-a- wyrównanie pamięci - większy niż rozmiar słowa. –
Dzięki za wskazanie mnie we właściwym kierunku! Nie wiedziałem o tym, przepraszam. Wciąż jestem nowy w językach niższego poziomu, takich jak C i Objective-C. Ale jak mogę uzyskać dane z NSData do tej wyrównanej struktury? Jeśli używam data.getBytes (& aStruct, length: sizeof (ASctruct)), to mam błędne wartości. – user4650218