在Swift的早期版本中,我已经能够使用posix_memalign
函数来分配对齐的内存以帮助优化某些操作。自从升级到Swift 3 beta(包含Xcode 8 beta 2)以来,它已经失败了,我不知道为什么。它可能只是测试版的一个问题,或者我只需要改变我与函数接口的方式。
我用于调查问题的示例代码如下所示。 (它尝试分配一个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
失败并显示“无效参数”。消息。
有什么想法吗?
答案 0 :(得分:1)
我意识到我的对齐不是8的倍数,而是4的倍数,这是无效的对齐(posix_memalign
期望对齐是UnsafeMutablePointer<Void>
的长度的倍数)。
简单地纠正我的对齐就解决了这个问题。
更令人惊讶的是,代码确实在Swift 2中运行,但已停止在Swift 3(Xcode 8附带的beta版)中工作。唯一相关的变化是从先前版本中允许UnsafeMutablePointer
变为零,而现在必须是可选的,以反映它可以为零的事实。