【问题标题】:Does Swift's UnsafeMutablePointer<Float>.allocate(...) actually allocate memory?Swift 的 UnsafeMutablePointer<Float>.allocate(...) 实际上分配内存吗?
【发布时间】:2018-05-28 02:37:49
【问题描述】:

我正在尝试了解 Swift 的不安全指针 API,以便处理音频样本。

非可变指针变体(UnsafePointer、UnsafeRawPointer、UnsafeBufferPointer)对我来说很有意义,它们都用于以只读方式引用先前分配的内存区域。这些变体没有类型方法“分配”

然而,可变变体(UnsafeMutablePointer、UnsafeMutableRawPointer)被记录为实际分配底层内存。 UnsafeMutablePointer (here) 文档中的示例:

静态函数分配(容量:Int)

为指定数量的Pointee类型实例分配未初始化的内存

但是,没有提到 UnsafeMutablePointer.allocate(size) 可能会失败,因此它实际上无法分配内存。相反,如果它确实分配了实际内存,你怎么知道它是否失败了?

我们将不胜感激。

【问题讨论】:

  • API说它分配内存,所以你应该把它当作它总是分配内存:)(如果你真的想知道它无法分配内存时会发生什么;it crashes your program) .

标签: swift memory memory-management


【解决方案1】:

我决定测试一下。我在 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 的调用似乎并没有立即分配内存。

【讨论】:

  • 非常有趣...这解释了(在各个地方)分配的内存必须先初始化才能读取的注释:“刚刚通过类型化指针分配或已被取消初始化的内存是处于未初始化状态。必须先初始化未初始化的内存,然后才能访问它以进行读取”但是,知道实际内存分配何时/是否失败的问题仍然存在-初始化函数不会引发错误我想我会坚持使用 malloc () - 至少我知道这是怎么回事..
  • @AndrewCoad 我相信初始化/取消初始化是为了让您可以使用引用类型。否则,当您释放指针时,您放入 UnsafeMutablePointer 的任何类类型都不会被释放,并且会泄漏。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-01-17
  • 2022-11-15
  • 1970-01-01
  • 2015-01-26
相关资源
最近更新 更多