我对类型为UnsafeMutablePointer<UInt8>
的变量提出质疑。
我有这个工作代码来分配并在Swift中将所有UInt8
数组设置为零
var bits = UnsafeMutablePointer<UInt8>(calloc(width * height, 8))
问题是我想在不使用calloc方法的情况下这样做。我有这个代码来分配数组
var bits = UnsafeMutablePointer<UInt8>.alloc(width * height)
但我找不到将所有内存设置为零的方法。
我知道我可以做到这一点,但我认为这不是最好的方法。
for index in 0..< (width * height) {
bits[index] = 0
}
答案 0 :(得分:11)
正如@matt建议的那样,您可以使用initializeFrom
初始化内存。我会使用Repeat
集合类型,因为它避免了任何临时分配:
var bits = UnsafeMutablePointer<UInt8>.alloc(width * height)
bits.initializeFrom(Repeat(count: width * height, repeatedValue: 0))
(注意,没有必要将值的类型赋予Repeat
,可以从bits
的类型推断出
如果您发现这么做很多,可能值得为calloc
创建一个UnsafeMutablePointer
的扩展程序:
extension UnsafeMutablePointer {
// version that takes any kind of type for initial value
static func calloc(num: Int, initialValue: T) -> UnsafeMutablePointer<T> {
let ptr = UnsafeMutablePointer<T>.alloc(num)
ptr.initializeFrom(Repeat(count: num, repeatedValue: initialValue))
return ptr
}
// convenience version for integer-literal-creatable types
// that initializes to zero of that type
static func calloc<I: IntegerLiteralConvertible>
(num: Int) -> UnsafeMutablePointer<I> {
return UnsafeMutablePointer<I>.calloc(num, initialValue: 0)
}
}
// creates 100 UInt8s initialized to 0
var bits = UnsafeMutablePointer<UInt8>.calloc(100)
答案 1 :(得分:2)
你可以说:
bits.initializeFrom(Array<UInt8>(count: width * height, repeatedValue: 0))
我猜测以这种方式复制内存存在一些潜在的效率。但是当然我们暂时制作阵列的效率很低。 [注意:AirspeedVelocity的答案显示了避免这种情况的方法。]
就个人而言,我最喜欢你原来的循环,特别是如果你写得更紧凑,就像这样:
(0 ..< (width*height)).map {bits[$0] = 0}