在swift中分配特定数量的内存 – iOS

在swift中分配特定数量的内存 – iOS,第1张

概述我正在学习仪器,所以我创建了一个简单的应用程序,让用户输入要分配的多个兆字节(MB).我使用Instruments中的“Allocations”工具来确保分配这些确切数量的数据.但是,我总是看到仪器中分配的内存比我预期的多. 我做了以下 func allocateMemoryOfSize(numberOfBytes: Int) { var bytesArray = [Int8]() 我正在学习仪器,所以我创建了一个简单的应用程序,让用户输入要分配的多个兆字节(MB).我使用Instruments中的“Allocations”工具来确保分配这些确切数量的数据.但是,我总是看到仪器中分配的内存比我预期的多.

我做了以下

func allocateMemoryOfSize(numberOfBytes: Int) {    var bytesArray = [Int8]()    for i in 0 ..< numberOfBytes {        bytesArray.append(Int8(i % 7))    }}

我检查了很多问题,我找到了一个替代方案:

func allocateMemoryOfSize(numberOfBytes: Int) {      var imageData = UnsafeMutablePointer<Int8>.alloc(numberOfBytes)}

但我仍然分配更多的内存.当我分配10 MB时,这是仪器中的结果:

在运行allocateMemoryOfSize函数之前:

在功能运行期间:使用44.96 MB

运行功能后:回到20.58 MB

因此,该函数分配大约22 MB而不是10.我究竟做错了什么?或者这是额外的内存管理?

在第一种情况下,当您在内部向数组追加字节时,它会在没有可用空间时使用重新分配.这种重新分配通常会使当前数组大小加倍.
以下是它的外观:

您看到分配是通过一些额外的空间完成的.

如果我们改变你的功能来预分配内存:

func allocateMemoryOfSize(numberOfBytes: Int) {    buffer = [UInt8](count: numberOfBytes,repeatedValue: 0)    for i in 0 ..< numberOfBytes {        buffer[i] = UInt8(i % 7)    }}

我们会看到这个:

更新#1

使用不安全指针进行分配也会起作用.主要缺点是手动内存管理:您必须明确释放它.

关于分配摘要:当您分配内存时,也会发生一些系统分配.在我的屏幕截图中,您可以看到不仅使用调用者swift.slowAlloc分配了10兆字节,而且还使用调用者_dispatch_alloc_try_create_heap分配了8兆字节.因此,您将在图表上看到应用程序使用18兆字节而不是10.我不知道为什么这个系统分配也会发生,因为它是iOS内部.我认为你只需要注意你的分配.在我的例子中,我看到10兆字节被请求并提供给应用程序.

总结

以上是内存溢出为你收集整理的在swift中分配特定数量的内存 – iOS全部内容,希望文章能够帮你解决在swift中分配特定数量的内存 – iOS所遇到的程序开发问题。

如果觉得内存溢出网站内容还不错,欢迎将内存溢出网站推荐给程序员好友。

欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/web/1041322.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-05-24
下一篇 2022-05-24

发表评论

登录后才能评论

评论列表(0条)

保存