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)
Другие вопросы по тегам