【问题标题】:What's the difference between casting and coercing a pointer in swift?快速转换和强制指针有什么区别?
【发布时间】:2016-04-10 01:22:51
【问题描述】:

动机是尝试使用带有 C API 的回调,在其中我通过 void 指针传递我想要的任何内容。

假设我有一个x: UnsafePointer<Void>。我知道它真正是什么,所以我想适当地转换指针。使用 unsafeBitCast 或仅将 UnsafePointer 应用于 x 有什么区别?换句话说

let y = unsafeBitCast(x, to: UnsafePointer<MyStruct>.self)

不同于

let z = UnsafePointer<MyStruct>(x)

以某种方式?

【问题讨论】:

  • 为了使用 C API,最好将 C API 包装在一个非常薄的 Swift 层中,在其中执行从 void 指针到 Swift 值的不安全映射。然后,您的其余代码将通过您的 Swift 代码,并且您的代码库中不会出现这种非常不稳定的代码——它们都被收集到一组包装器代码中。

标签: swift pointers void-pointers


【解决方案1】:

unsafeBitCastany 两种大小相同的 Swift 类型之间的不安全转换。也就是说,你可以写unsafeBitCast(x, UnsafePointer&lt;MyStruct&gt;.self),但你也可以写unsafeBitCast(x, MyClass.self)unsafeBitCast(x, Int.self)。这通常是非常不安全的,因为 Swift 并不能保证其类型的内存布局。在您的情况下,使用 UnsafePointer 或 Unmanaged 可能是更好的选择。

“强制”UnsafePointer&lt;MyStruct&gt;(x) 并不是真正的特殊语言功能,它只是 an UnsafePointer initializer 需要另一个 UnsafePointer。它的作用是将相同内存地址的值重新解释为不同的类型,类似于 C 中的指针类型之间的转换(或 C++ 中的static_casting)。两种 Swift 类型(UnsafePointer 的两种变体)之间的转换是安全的,但当然它们仍然是Unsafe指针,因此您必须确定您正在正确访问内存;您仍然负责分配和解除分配。

【讨论】:

  • 也就是说,一旦你访问了UnsafePointermemory 属性,你就和拥有unsafeBitCast 一样,对吧?
  • 两者之间是否存在性能影响?它们实际上都是免费的吗?
  • 是的,它们应该是,尤其是当您开启优化时。
猜你喜欢
  • 2012-02-10
  • 2021-05-28
  • 2010-12-08
  • 1970-01-01
  • 2011-04-04
  • 2010-12-17
  • 2013-07-12
  • 1970-01-01
  • 2023-04-06
相关资源
最近更新 更多