As far as I know, the only guarantee is made for structures imported from C. From https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20160516/001968.html <https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20160516/001968.html> :
Swift structs have unspecified layout. If you depend on a specific layout, you should define the struct in C and import it into Swift for now. and from https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20160516/001980.html <https://lists.swift.org/pipermail/swift-users/Week-of-Mon-20160516/001980.html> : That's not necessary. You can leave the struct defined in C and import it into Swift. Swift will respect C's layout. Regards, Martin > On 28. Apr 2017, at 13:03, Johannes Weiss via swift-users > <swift-users@swift.org> wrote: > > Hi swift-users, > > (sorry for the cross post to swift-dev, but wasn't sure where it belongs) > > I tried to find guarantees about the memory layout Swift tuples but couldn't > find anything. The reason I ask is because I'd like to use them as fixed > sized (stack allocated) arrays. I'm pretty sure they're actually not > guaranteed to be stack allocated but highly likely I assume :). > > Am I correct in assuming that > > let swift_events: (kevent, kevent) = ... > > has the same memory layout as > > struct kevent c_events[2] = ... > > ? In other words, is this legal: > > var events = (kevent(), kevent()) > withUnsafeMutableBytes(of: &events) { event_ptr in > precondition(MemoryLayout<kevent>.size * 2 == event_ptr.count) > if let ptr = event_ptr.baseAddress?.bindMemory(to: kevent.self, > capacity: 2) { > return kevent(someFileDescriptor, ptr, 2, ptr, 2, nil) > } > } > > I'm assuming yes but I'd like to make sure. > > Many thanks, > Johannes > > _______________________________________________ > swift-users mailing list > swift-users@swift.org > https://lists.swift.org/mailman/listinfo/swift-users
_______________________________________________ swift-users mailing list swift-users@swift.org https://lists.swift.org/mailman/listinfo/swift-users