Swift是否保证类和结构中字段的存储顺序?
在C中,您在结构中定义字段的顺序是它们将在内存中实例化的顺序.考虑到内存对齐,下面的结构在内存中的大小为8字节,如图所示,但如果字段反转则只有6个字节,因为不需要任何对齐填充.
struct s { int32_t a; /* 2 bytes of padding to align a 64 bit integer */ int64_t b; } 这种排序保证存在于C结构,C类(和结构)和Objective-C类中. 对于Swift类和结构中的字段,存储顺序是否同样有保证?或者(鉴于该语言不支持与列出的其他语言相同的指针),编译器是否在编译时为您重新安排它们?
是的,内存中struct元素的顺序是
他们的声明.细节可以找到 在 The Swift ABI (重点补充).但请注意使用“当前”,所以这个 可能会在未来的Swift版本中发生变化:
填充/对齐与C不同:
只有从C导入结构,才能保证具有
和later in that discussion:
例: struct A { var a: UInt8 = 0 var b: UInt32 = 0 var c: UInt8 = 0 } struct B { var sa: A var d: UInt8 = 0 } // Swift 2: print(sizeof(A),strideof(A)) // 9,12 print(sizeof(B),strideof(B)) // 10,12 // Swift 3: print(MemoryLayout<A>.size,MemoryLayout<A>.stride) // 9,12 print(MemoryLayout<B>.size,MemoryLayout<B>.stride) // 10,12 这里var d:UInt8在var sa的尾部填充中布局:A. struct CA { uint8_t a; uint32_t b; uint8_t c; }; struct CB { struct CA ca; uint8_t d; }; 然后将其导入Swift // Swift 2: print(sizeof(CA),strideof(CA)) // 9,12 print(sizeof(CB),strideof(CB)) // 13,16 // Swift 3: print(MemoryLayout<CA>.size,MemoryLayout<CA>.stride) // 12,12 print(MemoryLayout<CB>.size,MemoryLayout<CB>.stride) // 16,16 因为uint8_t d是在结构CA sa的尾部填充之后布局的. 从Swift 3开始,尺寸和步幅都返回相同的值 这是一个简单的函数,有助于演示上面的内容(Swift 3): func showMemory<T>(_ ptr: UnsafePointer<T>) { let data = Data(bytes: UnsafeRawPointer(ptr),count: MemoryLayout<T>.size) print(data as NSData) } Swift中定义的结构: var a = A(a: 0xaa,b: 0xbbbbbbbb,c: 0xcc) showMemory(&a) // <aa000000 bbbbbbbb cc> var b = B(sa: a,d: 0xdd) showMemory(&b) // <aa000000 bbbbbbbb ccdd> 从C导入的结构: var ca = CA(a: 0xaa,c: 0xcc) showMemory(&ca) // <aa000000 bbbbbbbb cc000000> var cb = CB(ca: ca,d: 0xdd) showMemory(&cb) // <aa000000 bbbbbbbb cc000000 dd000000> (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |
- postgresql常用命令
- React.js 小书 Lesson22 - props.children 和容器类组件
- c# – 检查正在运行的应用程序或哪个选项卡处于活动状态
- 组合模式-系统由可以被统一处理的对象组成,对象可以单一或
- Swift真的可以用做安卓APP主要开发语言吗?
- swift – SceneKit:应用程序在SCNView上渲染SpriteKit粒子
- 如何在 Visual Basic 控件中实现 IObjectSafety
- CMarkup类解析xml文件 例子
- ruby-on-rails – Order_by多个字段,包括布尔值
- Alternativa3D 8 在 Flash Builder 中的配置