Swift 3 中的对齐内存

Aligned memory in Swift 3

在之前的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 失败并显示 "Invalid argument." 消息。

有什么想法吗?

我意识到我的对齐方式不是 8 的倍数,而是 4 的倍数,这是无效对齐方式(posix_memalign 期望对齐方式是 a 长度的倍数 UnsafeMutablePointer<Void>).

只需更正对齐即可解决问题。

更令人惊讶的是,该代码在 Swift 2 中确实有效,但在 Swift 3 中已停止工作(Xcode 8 中包含测试版)。唯一相关的变化是在以前的版本中不允许 UnsafeMutablePointer 为 nil,而现在它必须是可选的以反映它可以为 nil 的事实。