Memset для UnsafeMutablePointer<UInt8> в быстром
У меня есть проблема с переменной с типом UnsafeMutablePointer<UInt8>
,
У меня есть этот рабочий код, чтобы выделить и установить на ноль все UInt8
массив в Swift.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
}
2 ответа
Ты мог бы сказать:
bits.initializeFrom(Array<UInt8>(count: width * height, repeatedValue: 0))
Я полагаю, что копирование памяти таким способом имеет смысл. Но, конечно, есть неэффективность в том, что мы временно создаем массив. [ПРИМЕЧАНИЕ: ответ AirspeedVelocity показывает способ избежать этого.]
Лично мне больше всего понравился ваш оригинальный цикл, особенно если вы пишете его более компактно, например так:
(0 ..< (width*height)).map {bits[$0] = 0}
Как подсказывает @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)