Swift 3中的对齐内存

时间:2016-07-14 21:37:28

标签: swift posix swift3

在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失败并显示“无效参数”。消息。

有什么想法吗?

1 个答案:

答案 0 :(得分:1)

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

简单地纠正我的对齐就解决了这个问题。

更令人惊讶的是,代码确实在Swift 2中运行,但已停止在Swift 3(Xcode 8附带的beta版)中工作。唯一相关的变化是从先前版本中允许UnsafeMutablePointer变为零,而现在必须是可选的,以反映它可以为零的事实。