swift – UnsafeRawPointer assumeMemoryBound vs. bindMemory
任何人都可以解释UnsafeRawPointer.assumimgMemoryBound(to :)和UnsafeRawPointer.bindMemory(to:capacity :)之间有什么区别?
编译或运行时差的一个实际例子将更受欢迎. Swift Doc说关于bindMemory(to:capacity :):
是什么意思将未初始化的内存绑定到一个类型准备内存来存储该类型的值?它分配了字节,对吧?那么bindMemory(to:capacity :)完成后有什么不同?
Swift中分配的内存可以是:
>未初始化的原始内存 当您使用UnsafeMutableRawPointer.allocate(bytes:alignedTo :)分配内存时,您将获得未初始化的原始内存. 当您使用UnsafeMutablePointer< T> .allocate(capacity :)分配内存时,您将获得与T类型绑定的未初始化内存. > 请注意,此方法不执行分配或初始化;它只是改变了内存的绑定类型. 这里要注意的一件重要事情是内存只能在给定时间绑定到一种类型.您可以自由重新绑定到其他类型(具有上述初始化内存的限制);但是,尝试访问绑定到给定类型的内存作为无关类型会违反严格别名,因此是未定义的行为. 另外需要注意的是,相关类型和布局兼容类型是独立的概念: >类型T是与类型U兼容的布局,如果绑定到类型U的存储器可以按位重新解释为具有类型T.注意,这不一定是双向关系.例如,如果(Int,Int)的一个“实例”可以被重新解释为2 x Int,则Int与布局兼容(Int,Int).反过来说不可能是真的;您不能从单个Int形成(Int,Int)值. 但是,我不相信Swift已经正式定义了这些术语的任何规则(我希望这将伴随ABI稳定性).
目前,没什么.作为Andrew Trick says在邮件列表中讨论Martin linked to:
有关此主题的进一步阅读,请参阅memory model explanation section of SE-0107以及此unofficial guide to strict aliasing in Swift. (编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |