Swift 计算错误的结构大小

Swift calculates wrong size of struct

今天我遇到了 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 的大小相同。

为什么第一个结构体有8个字节那么大? 我做错了什么还是这是一个错误?

(在 OS X Mavericks 上使用 Xcode 6.1.1 (6A2008a) 进行测试,Mac 的正常命令行应用程序)

这是因为 Swift 通过在 UInt16UInt32 之间插入两个字节的 "gap" 将 UInt32 字段对齐到 4 字节边界。如果将字段切换为 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

But then, how can I get data from NSData into this aligned struct? If I use data.getBytes(&aStruct, length: sizeof(AStruct)) then I have wrong values.

不一定:如果您使用相同的方法保存 AStruct,那么 NSData 中也会存在间隙,因此获取二进制数据就像放置 "a cookie cutter"到具有相同对齐方式的预填充字节数组。