UnsafeRawPointer
声明
@frozen struct UnsafeRawPointer
概述
UnsafeRawPointer
类型不提供自动内存管理、类型安全和对齐保证。您有责任通过不安全的指针处理您使用的任何内存的生命周期,以避免泄漏或未定义的行为。
您手动管理的内存可以是特定类型的untyped
或bound
。您可以使用 UnsafeRawPointer
类型来访问和管理内存中的原始字节,无论该内存是否已绑定到特定类型。
了解指针的内存状态
UnsafeRawPointer
实例引用的内存可以处于多种状态之一。许多指针操作只能应用于内存处于特定状态的指针——您必须跟踪正在使用的内存的状态,并了解不同操作执行的对该状态的更改。内存可以是无类型的和未初始化的,绑定到一个类型但未初始化,或者绑定到一个类型并初始化为一个值。最后,先前分配的内存可能已被释放,留下现有指针引用未分配的内存。
未初始化的原始内存
刚刚分配的原始内存处于uninitialized, untyped
状态。未初始化的内存必须使用类型的值进行初始化,然后才能用于任何类型化的操作。
要将未初始化的内存绑定到类型而不对其进行初始化,请使用bindMemory(to:count:)
方法。此方法返回一个类型化的指针,以便进一步对内存进行类型化访问。
打字 memory
已绑定到某个类型的内存,无论是已初始化的还是未初始化的,通常使用类型化指针(例如 UnsafePointer
和 UnsafeMutablePointer
的实例)来访问。可以使用UnsafeMutablePointer
方法执行初始化、分配和取消初始化。
只有在取消初始化或绑定类型为 trivial type
后,才能将已绑定到类型的内存重新绑定到其他类型。取消初始化类型化内存不会取消绑定该内存的类型。可以使用相同类型的值重新初始化已取消初始化的内存,绑定到新类型或解除分配。
当内存绑定到类型时,从内存中读取原始字节时,您必须确保满足任何对齐要求。
原始指针算术
原始指针的指针运算在字节级别执行。当您添加或减去原始指针时,结果是一个新的原始指针偏移该字节数。以下示例分配四个字节的内存并将0xFF
存储在所有四个字节中:
let bytesPointer = UnsafeMutableRawPointer.allocate(byteCount: 4, alignment: 4)
bytesPointer.storeBytes(of: 0xFFFF_FFFF, as: UInt32.self)
// Load a value from the memory referenced by 'bytesPointer'
let x = bytesPointer.load(as: UInt8.self) // 255
// Load a value from the last two allocated bytes
let offsetPointer = bytesPointer + 2
let y = offsetPointer.load(as: UInt16.self) // 65535
上面的代码将值0xFFFF_FFFF
存储到四个新分配的字节中,然后将第一个字节作为UInt8
实例加载,将第三和第四个字节作为UInt16
实例加载。
永远记得释放你自己分配的任何内存。
bytesPointer.deallocate()
隐式转换和桥接
当使用 UnsafeRawPointer
参数调用函数或方法时,您可以传递该特定指针类型的实例,传递兼容指针类型的实例,或使用 Swift 的隐式桥接来传递兼容指针。
例如,以下代码示例中的 print(address:as:)
函数将 UnsafeRawPointer
实例作为其第一个参数:
func print<T>(address p: UnsafeRawPointer, as type: T.Type) {
let value = p.load(as: type)
print(value)
}
与 Swift 中的典型情况一样,您可以使用 UnsafeRawPointer
实例调用 print(address:as:)
函数。此示例将 rawPointer
作为初始参数传递。
// 'rawPointer' points to memory initialized with `Int` values.
let rawPointer: UnsafeRawPointer = ...
print(address: rawPointer, as: Int.self)
// Prints "42"
因为类型化指针在作为参数传递时可以隐式转换为原始指针,所以您也可以使用任何可变或不可变类型化指针实例调用print(address:as:)
。
let intPointer: UnsafePointer<Int> = ...
print(address: intPointer, as: Int.self)
// Prints "42"
let mutableIntPointer = UnsafeMutablePointer(mutating: intPointer)
print(address: mutableIntPointer, as: Int.self)
// Prints "42"
或者,您可以使用 Swift 的 implicit bridging
将指针传递给实例或数组的元素。使用 inout 语法隐式创建指向任何类型实例的指针。以下示例在调用 print(address:as:)
时使用隐式桥接传递指向 value
的指针:
var value: Int = 23
print(address: &value, as: Int.self)
// Prints "23"
当您将数组作为参数传递时,会隐式创建指向数组元素的不可变指针。此示例在调用 print(address:as:)
时使用隐式桥接将指针传递给 numbers
的元素。
let numbers = [5, 10, 15, 20]
print(address: numbers, as: Int.self)
// Prints "5"
您还可以使用 inout 语法将可变指针传递给数组的元素。因为print(address:as:)
需要一个不可变指针,虽然这在语法上是有效的,但它不是必需的。
var mutableNumbers = numbers
print(address: &mutableNumbers, as: Int.self)
可用版本
相关用法
- Swift UnsafeRawPointer advanced(by:)用法及代码示例
- Swift UnsafeRawPointer ...(_:_:)用法及代码示例
- Swift UnsafeRawPointer ..<(_:)用法及代码示例
- Swift UnsafeRawPointer bindMemory(to:capacity:)用法及代码示例
- Swift UnsafeRawPointer ...(_:)用法及代码示例
- Swift UnsafeRawPointer withMemoryRebound(to:capacity:_:)用法及代码示例
- Swift UnsafeRawPointer ..<(_:_:)用法及代码示例
- Swift UnsafeRawBufferPointer.Iterator dropFirst(_:)用法及代码示例
- Swift UnsafeRawBufferPointer.Iterator max()用法及代码示例
- Swift UnsafeRawBufferPointer shuffled(using:)用法及代码示例
- Swift UnsafeRawBufferPointer isEmpty用法及代码示例
- Swift UnsafeRawBufferPointer enumerated()用法及代码示例
- Swift UnsafeRawBufferPointer subscript(_:)用法及代码示例
- Swift UnsafeRawBufferPointer starts(with:)用法及代码示例
- Swift UnsafeRawBufferPointer.Iterator filter(_:)用法及代码示例
- Swift UnsafeRawBufferPointer firstIndex(where:)用法及代码示例
- Swift UnsafeRawBufferPointer.Iterator drop(while:)用法及代码示例
- Swift UnsafeRawBufferPointer.Iterator min()用法及代码示例
- Swift UnsafeRawBufferPointer.Iterator contains(where:)用法及代码示例
- Swift UnsafeRawBufferPointer contains(where:)用法及代码示例
- Swift UnsafeRawBufferPointer.Iterator contains(_:)用法及代码示例
- Swift UnsafeRawBufferPointer.Iterator reduce(into:_:)用法及代码示例
- Swift UnsafeRawBufferPointer first(where:)用法及代码示例
- Swift UnsafeRawBufferPointer.Iterator map(_:)用法及代码示例
- Swift UnsafeRawBufferPointer allSatisfy(_:)用法及代码示例
注:本文由纯净天空筛选整理自apple.com大神的英文原创作品 UnsafeRawPointer。非经特殊声明,原始代码版权归原作者所有,本译文未经允许或授权,请勿转载或复制。