> On Sep 23, 2016, at 2:23 PM, Joe Groff <jgr...@apple.com> wrote:
>
>
>> On Sep 23, 2016, at 2:20 PM, Jens Persson <j...@bitcycle.com> wrote:
>>
>> What is the difference between:
>> ptr.storeBytes(of: x, toByteOffset: offset, as: type(of: x))
>> ptr.advanced(by: offset).assumingMemoryBound(to: type(of: x)).pointee = x
>> ?
>> I noticed that the former traps if storing to a misaligned offset while the
>> latter is happy to do that, and I saw it mentioned as a requirement in the
>> documentation, but other than that I'm not sure what would be the pros and
>> cons of using the former / latter?
>
> cc'ing Andy, who's the expert on this. AIUI, the former does not semantically
> bind the memory to the type being stored—informally, it has "memcpy
> semantics"—whereas the latter *will* bind the memory to a type, which will
> require all other loads and stores derived from the same pointer to remain of
> the same type. Neither API officially supports unaligned loads or stores yet;
> if one crashes and the other doesn't, that's an accident.
>
> -Joe
storeBytes(of:as:) is an untyped memory operation. e.g. you could use it store
a UInt32 to an Float’s location without binding memory.
assumingMemoryBound(to:) gives you a typed pointer, that you the programmer
must guarantee is the correct type for that memory location. If you use this to
get a UInt32 pointer into a Float’s location, you get undefined behavior as
soon as you access the pointee.
storeBytes traps on misaligned access because memory is being reinterpreted
making it easy to violate the alignment precondition.
UnsafePointer<T>.pointee never checked the alignment precondition because
normally you wouldn’t need to and it’s supposed to be zero overhead.
assumingMemoryBound(to:) does not check alignment because it isn’t undefined
behavior until the pointer is accessed and it’s supposed to be zero overhead.
Basically assumingMemoryBound(to:) is the one backdoor that we have for force
casting pointers. The “assuming” should clue the programmer in that they really
need to know what they’re doing before using it.
https://swift.org/migration-guide/se-0107-migrate.html#api-for-binding-memory-types-and-pointer-conversion
<https://swift.org/migration-guide/se-0107-migrate.html#api-for-binding-memory-types-and-pointer-conversion>
-Andy
_______________________________________________
swift-users mailing list
swift-users@swift.org
https://lists.swift.org/mailman/listinfo/swift-users