2016-07-14 47 views
1

在之前的Swift版本中,我可以使用posix_memalign函數來分配對齊的內存以幫助優化某些操作。自從升級到Swift 3 beta(包含Xcode 8 beta 2)以來,它一直在失敗,我不知道爲什麼。這可能只是beta版本的一個問題,或者我只需要改變我如何與函數接口。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附帶的beta版)中停止工作。唯一相關的變化是允許UnsafeMutablePointer在之前的版本中爲零,而現在它必須是可選的,以反映它可能爲零的事實。