[swift-evolution] [RFC] UnsafeBytePointer API for In-Memory Layout

Andrew Trick atrick at apple.com
Thu May 12 11:38:45 CDT 2016


> On May 12, 2016, at 8:41 AM, Joe Groff <jgroff at apple.com> wrote:
> 
>> Future improvements
>> 
>> UnsafeBytePointer should eventually support unaligned memory access. I believe that we will eventually have a modifier that allows "packed" struct members. At that time we may also want to add a "packed" flag to UnsafeBytePointer's load and initialize methods.
> 
> We should probably call out the fact that `load` and `initialize` require alignment in the meantime.

Will do.

>> When accessing a memory buffer, it is generally convenient to cast to a type with known layout and compute offsets relative to the type's size. This is how UnsafePointer<Pointee> works. A generic UnsafeTypePunnedPointer<Pointee> could be introduced with the same interface as UnsafePointer<Pointer>, but without the strict aliasing requirements. This seems like an overdesign simply to avoid calling strideof() in an rare use case, but nothing prevents adding this type later.
> 
> This need could also be addressed with some additional convenience methods on UnsafeBytePointer to load or store at a given index, something like:
> 
> 	func load<T>(asArrayOf type: T.Type, at index: Int) -> T {
> 		return (self + strideof(T) * index).load(T)
> 	}
> 	func initialize(asArrayOf type: T.Type, initialValue: T, at index: Int) {
> 		return (self + strideof(T) * index).initialize(initialValue)
> 	}

Yep. I like that.

-Andy


More information about the swift-evolution mailing list