Swift计算结构的错误大小

时间:2015-03-09 14:59:11

标签: xcode swift struct sizeof

今天我遇到了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的普通命令行应用程序)

1 个答案:

答案 0 :(得分:8)

这是因为Swift通过插入一个双字节"间隙"将UInt32字段对齐为4字节边界。在UInt16UInt32之间。如果切换字段以便首先显示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;到具有相同对齐的预填充字节数组。