memset с Swift 5.2 - PullRequest
       21

memset с Swift 5.2

1 голос
/ 28 марта 2020

Иногда мне нужно очистить часть байтового массива до нуля. С для l oop это медленно. Гораздо быстрее использует функцию memset (). У меня есть следующий код, который очищает элементы от 200 до 299 массива «a».

var a: [UInt8] = [UInt8](repeating: 1, count: 1000) // a[0..999] set to 1
start = 200
length = 100
memset(&a + start, 0, length) // a[100..199] set to 0

Это работало хорошо, пока не вышел Swift 5.2 с Xcode 11.4. Теперь это тоже работает, но появляется предупреждение:

Выражение Inout создает временный указатель, но аргумент # 1 должен быть указателем, который переживает вызов '+'

Как это можно сделать , чтобы не было предупреждения. У кого-нибудь есть идея?

Еще несколько объяснений - это whows в Xcode:

  1. Неявное преобразование аргумента из «[UInt8]» в «UnsafeMutableRawPointer» создает указатель, действительный только для продолжительность вызова '+'

  2. Используйте метод 'withUnsafeMutableBytes' в массиве для явного преобразования аргумента в указатель буфера, действительный для определенной области

Я не понимаю, что это значит.

1 Ответ

3 голосов
/ 28 марта 2020

Подсказка для использования withUnsafeMutableBytes именно то, что вы должны следовать:

a.withUnsafeMutableBytes { ptr in
    _ = memset(ptr.baseAddress! + start, 0, length)
}
...