在 swift 中转换和强制指针有什么区别?
What's the difference between casting and coercing a pointer in swift?
动机是尝试使用带有 C API 的回调,我在其中通过 void 指针传递任何我想要的东西。
所以假设我有一个 x: UnsafePointer<Void>
。我知道 really 是什么,所以我想适当地转换指针。使用 unsafeBitCast 或仅将 UnsafePointer 应用于 x 有什么区别?也就是说
是
let y = unsafeBitCast(x, to: UnsafePointer<MyStruct>.self)
不同于
let z = UnsafePointer<MyStruct>(x)
在某种程度上?
unsafeBitCast
是 any 两个大小相同的 Swift 类型之间的不安全转换。也就是说,您可以写 unsafeBitCast(x, UnsafePointer<MyStruct>.self)
,但也可以写 unsafeBitCast(x, MyClass.self)
或 unsafeBitCast(x, Int.self)
。这通常是非常不安全的,因为 Swift 不能保证其类型的内存布局。在您的情况下,使用 UnsafePointer 或 Unmanaged 可能是更好的选择。
"coercion" UnsafePointer<MyStruct>(x)
并不是真正的特殊语言功能,它只是 an UnsafePointer initializer 需要另一个 UnsafePointer。它的作用是将同一内存地址处的值重新解释为不同类型,类似于 C 中指针类型之间的转换(或 C++ 中的 static_cast
ing)。两种Swift类型(UnsafePointer的两种变体)之间的转换是安全的,当然它们仍然是Unsafe指针,所以你必须确定你访问的是记忆正确;您仍然负责分配和解除分配。
动机是尝试使用带有 C API 的回调,我在其中通过 void 指针传递任何我想要的东西。
所以假设我有一个 x: UnsafePointer<Void>
。我知道 really 是什么,所以我想适当地转换指针。使用 unsafeBitCast 或仅将 UnsafePointer 应用于 x 有什么区别?也就是说
是
let y = unsafeBitCast(x, to: UnsafePointer<MyStruct>.self)
不同于
let z = UnsafePointer<MyStruct>(x)
在某种程度上?
unsafeBitCast
是 any 两个大小相同的 Swift 类型之间的不安全转换。也就是说,您可以写 unsafeBitCast(x, UnsafePointer<MyStruct>.self)
,但也可以写 unsafeBitCast(x, MyClass.self)
或 unsafeBitCast(x, Int.self)
。这通常是非常不安全的,因为 Swift 不能保证其类型的内存布局。在您的情况下,使用 UnsafePointer 或 Unmanaged 可能是更好的选择。
"coercion" UnsafePointer<MyStruct>(x)
并不是真正的特殊语言功能,它只是 an UnsafePointer initializer 需要另一个 UnsafePointer。它的作用是将同一内存地址处的值重新解释为不同类型,类似于 C 中指针类型之间的转换(或 C++ 中的 static_cast
ing)。两种Swift类型(UnsafePointer的两种变体)之间的转换是安全的,当然它们仍然是Unsafe指针,所以你必须确定你访问的是记忆正确;您仍然负责分配和解除分配。