首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >在iOS中分配特定数量的内存

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

Stack Overflow用户
提问于 2015-09-11 23:23:00
回答 3查看 5.6K关注 0票数 7

我正在学习仪器,所以我创建了一个简单的应用程序,让用户输入大量的Mega (MB)来分配。我使用仪器中的“分配”工具来确保分配这个确切的数据量。然而,我总是看到在仪器中分配的内存比我预期的要多。

我做了以下工作

代码语言:javascript
运行
复制
func allocateMemoryOfSize(numberOfBytes: Int) {

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

我检查了许多问题,发现了另一种方法:

代码语言:javascript
运行
复制
func allocateMemoryOfSize(numberOfBytes: Int) {
      var imageData = UnsafeMutablePointer<Int8>.alloc(numberOfBytes)}

但我仍然得到了更多的内存分配。这是当我分配10 MBs时仪器的结果:

在运行allocateMemoryOfSize函数之前:

在运行该函数时:使用了44.96MB

函数运行后:返回到仅20.58MB

因此,该功能大约分配22 MBs,而不是按需要分配10 MBs。我做错了什么?或者这是额外的内存管理吗?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2015-09-12 09:10:16

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

您可以看到,分配是用一些额外的空间完成的。

如果我们将您的函数更改为预分配内存:

代码语言:javascript
运行
复制
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兆字节的请求,并提供给app。

票数 6
EN

Stack Overflow用户

发布于 2017-06-27 12:03:28

Swift 3.1:

代码语言:javascript
运行
复制
static var buffer = [UInt8]()

static func allocateMemoryOfSize(numberOfMegaBytes: Int) {
    print("Allocating \(numberOfMegaBytes)MB of memory")
    let mb = 1048576
    let newBuffer = [UInt8](repeating: 0, count: numberOfMegaBytes * mb)
    buffer += newBuffer
}
票数 2
EN

Stack Overflow用户

发布于 2017-03-29 09:53:59

我做了这个:

代码语言:javascript
运行
复制
static var buffer = [UInt8]()
static func allocateMemoryOfSize(numberOfMegaBytes: Int) {
    print("Allocating \(numberOfMegaBytes)MB of memory")
    let mb = 1048576
    let newBuffer = [UInt8](count: numberOfMegaBytes * mb, repeatedValue: 0)
   buffer += newBuffer
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/32533473

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档