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 通过在 UInt16
和 UInt32
之间插入两个字节的 "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"到具有相同对齐方式的预填充字节数组。
今天我遇到了 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 通过在 UInt16
和 UInt32
之间插入两个字节的 "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 usedata.getBytes(&aStruct, length: sizeof(AStruct))
then I have wrong values.
不一定:如果您使用相同的方法保存 AStruct
,那么 NSData
中也会存在间隙,因此获取二进制数据就像放置 "a cookie cutter"到具有相同对齐方式的预填充字节数组。