Swift UnsafeRawPointer assumingMemoryBound vs.bindMemory
有人能解释一下Swift UnsafeRawPointer assumingMemoryBound vs.bindMemory,swift,pointers,memory,Swift,Pointers,Memory,有人能解释一下UnsafeRawPointer.assumgmgmmemorybound(to:)和UnsafeRawPointer.bindMemory(to:capacity:)之间的区别吗 一个编译时差或运行时差的实际例子更受欢迎 关于bindMemory(to:capacity:): 这个API允许一个内存区域在程序的不同点保存不相关的类型。将未初始化的内存绑定到类型会准备内存来存储该类型的值。已初始化的绑定内存将内存中的值重新解释为新类型。如果旧值不是平凡的(需要销毁),或者在被覆盖之
UnsafeRawPointer.assumgmgmmemorybound(to:)
和UnsafeRawPointer.bindMemory(to:capacity:)
之间的区别吗
一个编译时差或运行时差的实际例子更受欢迎
关于bindMemory(to:capacity:)
:
这个API允许一个内存区域在程序的不同点保存不相关的类型。将未初始化的内存绑定到类型会准备内存来存储该类型的值。已初始化的绑定内存将内存中的值重新解释为新类型。如果旧值不是平凡的(需要销毁),或者在被覆盖之前从内存中读取,那么新类型必须与旧类型在布局上相互兼容
将未初始化的内存绑定到一个类型意味着什么?准备内存来存储该类型的值?它被分配了字节,对吗?那么,在
bindMemory(to:capacity:)
完成后有什么不同呢?Swift中分配的内存可以是:
- 未初始化的原始内存
- 绑定到类型的未初始化内存
- 绑定到类型的初始化内存
UnsafeMutableRawPointer.allocate(字节:alignedTo:)
分配内存时,您将获得未初始化的原始内存
当您使用UnsafeMutablePointer.allocate(capacity:)
分配内存时,您会得到绑定到类型T
的未初始化内存
- (重新)将指针的内存绑定到一个新类型,并返回一个类型化指针来访问它。在上述任何状态下,它都可以在指向内存的指针上调用;尽管内存已初始化,但新绑定类型必须与旧绑定类型布局兼容,并且两种类型都应兼容 请注意,此方法不执行分配或初始化;它仅仅改变了内存的绑定类型
- 是一种从已知的指向绑定到给定类型的内存的原始指针获取类型指针的方法。如果内存未绑定到此类型,则通过返回的类型指针访问内存是未定义的行为
- 如果绑定到类型
的内存可以按位重新解释为具有类型U
,则类型T
的布局与类型T
兼容。请注意,这不一定是双向关系。例如,U
与Int
布局兼容,如果(Int,Int)
的一个“实例”可以重新解释为2 x(Int,Int)
。然而,事实并非如此;不能从单个Int
中形成Int
值(Int,Int)
- 如果可以将重叠内存别名为这两种类型,则这两种类型是相关的。例如,如果您有一个
和一个UnsafePointer
,如果UnsafePointer
和T
是不相关的类型,则它们不能指向彼此重叠的内存U
bindMemory(to:capacity:)
完成后有什么不同呢
目前没有。正如在邮件列表讨论中所述:
绑定内存向编译器传递内存位置对于类型化访问是安全的。运行时不会发生任何事情——除非有人编写类型安全消毒剂。它影响内存位置的抽象状态,与用于访问该内存的指针变量无关。为了方便和清晰,绑定内存返回一个类型化指针,但这个特定指针值并没有什么特别之处
有关此主题的更多信息,请参阅,以及。Swift中的分配内存可以是:
- 未初始化的原始内存
- 绑定到类型的未初始化内存
- 绑定到类型的初始化内存
UnsafeMutableRawPointer.allocate(字节:alignedTo:)
分配内存时,您将获得未初始化的原始内存
当您使用UnsafeMutablePointer.allocate(capacity:)
分配内存时,您会得到绑定到类型T
的未初始化内存
- (重新)将指针的内存绑定到一个新类型,并返回一个类型化指针来访问它。在上述任何状态下,它都可以在指向内存的指针上调用;尽管内存已初始化,但新绑定类型必须与旧绑定类型布局兼容,并且两种类型都应兼容 请注意,此方法不执行分配或初始化;它仅仅改变了内存的绑定类型
- 是一种从已知的指向绑定到给定类型的内存的原始指针获取类型指针的方法。如果内存未绑定到此类型,则通过返回的类型指针访问内存是未定义的行为