在以前的 Swift 版本中,我已经能够使用 posix_memalign
函数来分配对齐的内存,以帮助优化某些操作。自升级到 Swift 3 beta(与 Xcode 8 beta 2 一起打包)以来,它一直在失败,我不确定为什么。这可能只是 Beta 版的问题,或者我可能只是需要更改我与该功能的交互方式。
我一直用来调查问题的示例代码如下所示。 (它尝试分配一个 16K 对齐的 float 缓冲区。)
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
因“无效参数”而失败。消息。
有什么想法吗?
最佳答案
我意识到我的对齐不是 8 的倍数,而是 4 的倍数,这是无效对齐(posix_memalign
期望对齐是 UnsafeMutablePointer<Void>
长度的倍数)。
只需更正我的对齐方式即可解决问题。
更令人惊讶的是,该代码在 Swift 2 中确实有效,但在 Swift 3(Xcode 8 中包含的测试版)中已停止工作。唯一相关的变化是允许 UnsafeMutablePointer
的开关。在以前的版本中为 nil,而现在它必须是可选的以反射(reflect)它可以为 nil 的事实。
关于swift - Swift 3 中的对齐内存,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38384671/