今天我遇到了Swift结构的问题。 例如,请参阅以下结构:
struct TestStruct {
var test: UInt16
var test2: UInt32
}
我认为这个结构的大小总共是6个字节,因为UInt16是2个字节而UInt32是4个字节大。
以下代码打印6(这是正确的):
println(sizeof(UInt32) + sizeof(UInt16))
但是如果我用
检查结构的大小println(sizeof(TestStruct))
它打印8而不是6。
如果我尝试使用以下结构:
struct TestStruct2 {
var test: UInt16
var test2: UInt16
var test3: UInt16
}
然后
println(sizeof(TestStruct2))
打印正确的值:6。但TestStruct的大小应与TestStruct2的大小相同。
为什么第一个struct 8字节大? 我做错了还是这个错误?
(在OS X Mavericks上使用Xcode 6.1.1(6A2008a)进行测试,适用于Mac的普通命令行应用程序)
答案 0 :(得分:8)
这是因为Swift通过插入一个双字节"间隙"将UInt32
字段对齐为4字节边界。在UInt16
和UInt32
之间。如果切换字段以便首先显示32位字段,则会消除间隙:
struct TestStruct1 {
var test: UInt16
var test2: UInt32
}
println(sizeof(TestStruct1)) // <<== Prints 8
struct TestStruct2 {
var test2: UInt32
var test: UInt16
}
println(sizeof(TestStruct2)) // <<== Prints 6
您还可以在不改变结构大小的情况下将另一个UInt16
放入该间隙中:
struct TestStruct3 {
var test0: UInt16
var test1: UInt16
var test2: UInt32
}
println(sizeof(TestStruct3)) // <<== Prints 8
但是,如何从
NSData
获取数据到这个对齐的结构中?如果我使用data.getBytes(&aStruct, length: sizeof(AStruct))
,那么我的值就会错误。
不一定:如果您使用相同的方法保存AStruct
,那么NSData
中也会存在差距,因此获取二进制数据就像放置&#34;一个千篇一律的& #34;到具有相同对齐的预填充字节数组。