2016-07-14 7 views
1

В предыдущих версиях Swift я смог использовать функцию posix_memalign для выделения выровненной памяти для оптимизации определенных операций. Начиная с обновления до бета-версии Swift 3 (в комплекте с Xcode 8 beta 2), она терпит неудачу, и я не уверен, почему. Это может быть просто проблема с бета-версией, или, может быть, мне просто нужно изменить способ взаимодействия с этой функцией.Выделенная память в Swift 3

Ниже приведен пример кода, который я использовал для расследования проблемы. (Она пытается выделить буфер чисел с плавающей точкой, выровненная 16K.)

var pointer: UnsafeMutablePointer<Void>? = nil 
let alignment: Int = 0x4 
let length: Int = bufferSize 

let ret = posix_memalign(&pointer, alignment, length * sizeof(Float)) 

if ret != noErr { 
    let err = String(validatingUTF8: strerror(ret)) ?? "unknown error" 
    fatalError("Unable to allocate aligned memory: \(err).") 
} 

posix_memalign терпит неудачу с «недопустимым аргументом.» сообщение.

Любые идеи?

ответ

1

Я понял, что мое выравнивание не было кратным 8, а вместо этого кратным 4, что является недопустимым выравниванием (posix_memalign ожидает, что выравнивания будут кратными длине UnsafeMutablePointer<Void>).

Просто исправление моего выравнивания исправило проблему.

Более удивительно, что код действительно работал в Swift 2, но прекратил работу в Swift 3 (бета-версия включена в Xcode 8). Единственным связанным изменением был переход от разрешения UnsafeMutablePointer к нулю в предыдущей версии, тогда как теперь он должен быть необязательным, чтобы отразить тот факт, что он может быть равен нулю.

Смежные вопросы