我试图理解Swift的不安全指针API,以便操纵音频样本。
非可变指针变体(UnsafePointer,UnsafeRawPointer,UnsafeBufferPointer)对我有意义,它们都用于以只读方式引用先前分配的内存区域。没有类型方法"分配"对于这些变种
然而,可变变体(UnsafeMutablePointer,UnsafeMutableRawPointer)被记录为实际分配底层内存。 UnsafeMutablePointer(here)的文档示例:
static func allocate(capacity:Int)
为指定数量的Pointee类型的实例分配未初始化的内存
但是,没有提到UnsafeMutablePointer.allocate(size)可能会失败,因此无法实际分配内存。相反,如果它确实分配了实际内存,你怎么知道它是否失败了?
任何见解都将不胜感激。
答案 0 :(得分:0)
我决定测试一下。我在CodeRunner中运行了这个程序:
import Foundation
sleep(10)
当sleep
函数正在执行时,CodeRunner报告说我的机器上有5.6 MB的RAM,这是我们的基线。
然后我尝试了这个程序:
import Foundation
for _ in 0..<1000000 {
let ptr = UnsafeMutablePointer<Float>.allocate(capacity: 1)
}
sleep(10)
现在,CodeRunner报告了5.8 MB的RAM使用情况。比以前多一点,但肯定不是额外的4 MB,这应该占用。
最后,我为指针分配了一些内容:
import Foundation
for _ in 0..<1000000 {
let ptr = UnsafeMutablePointer<Float>.allocate(capacity: 1)
ptr.pointee = 0
}
sleep(10)
突然之间,该程序占用了21.5 MB的RAM,最终给了我们预期的RAM使用量增加,尽管数量超出了我的预期。
在CodeRunner中创建配置文件以在启用优化的情况下进行编译似乎没有对我所看到的行为产生影响。
所以,令人惊讶的是,似乎对UnsafeMutablePointer.allocate
的调用实际上并没有立即分配内存。