Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/swift/16.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/dart/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Swift UnsafeRawPointer assumingMemoryBound vs.bindMemory_Swift_Pointers_Memory - Fatal编程技术网

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)
    布局兼容,如果
    (Int,Int)
    的一个“实例”可以重新解释为2 x
    Int
    。然而,事实并非如此;不能从单个
    Int
    中形成
    (Int,Int)

  • 如果可以将重叠内存别名为这两种类型,则这两种类型是相关的。例如,如果您有一个
    UnsafePointer
    和一个
    UnsafePointer
    ,如果
    T
    U
    是不相关的类型,则它们不能指向彼此重叠的内存

然而,我认为Swift还没有正式为这些术语定义任何规则(我希望这将伴随ABI稳定性而来)

那么
bindMemory(to:capacity:)
完成后有什么不同呢

目前没有。正如在邮件列表讨论中所述:

绑定内存向编译器传递内存位置对于类型化访问是安全的。运行时不会发生任何事情——除非有人编写类型安全消毒剂。它影响内存位置的抽象状态,与用于访问该内存的指针变量无关。为了方便和清晰,绑定内存返回一个类型化指针,但这个特定指针值并没有什么特别之处


有关此主题的更多信息,请参阅,以及。

Swift中的分配内存可以是:

  • 未初始化的原始内存
  • 绑定到类型的未初始化内存
  • 绑定到类型的初始化内存
当您使用
UnsafeMutableRawPointer.allocate(字节:alignedTo:)
分配内存时,您将获得未初始化的原始内存

当您使用
UnsafeMutablePointer.allocate(capacity:)
分配内存时,您会得到绑定到类型
T
的未初始化内存

  • (重新)将指针的内存绑定到一个新类型,并返回一个类型化指针来访问它。在上述任何状态下,它都可以在指向内存的指针上调用;尽管内存已初始化,但新绑定类型必须与旧绑定类型布局兼容,并且两种类型都应兼容

    请注意,此方法不执行分配或初始化;它仅仅改变了内存的绑定类型

  • 是一种从已知的指向绑定到给定类型的内存的原始指针获取类型指针的方法。如果内存未绑定到此类型,则通过返回的类型指针访问内存是未定义的行为

这里需要注意的一件重要事情是,在给定的时间内,内存只能绑定到一种类型。您可以自由地重新绑定到其他类型(对初始化内存有上述限制);然而,试图以不相关的类型访问绑定到给定类型的内存违反了严格的别名,因此是未定义的行为

另外需要注意的是,相关类型和布局兼容类型是独立的概念:

<