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

allocate specific amount of memory in swift - iOS

我正在学习 Instruments,所以我创建了一个简单的应用程序,让用户输入要分配的兆字节 (MB) 数。我使用 Instruments 中的 "Allocations" 工具来确保分配了准确的数据量。但是,我总是看到 Instruments 中分配的内存比我预期的要多。

我做了以下事情

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 时 Instruments 中的结果:

在 运行 allocateMemoryOfSize 函数之前:

在函数 运行 期间:使用了 44.96 MB

函数运行后:回到只有20.58MB

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

在第一种情况下,当您在内部将字节附加到数组时,它会在没有可用空间时使用重新分配 space。这种重新分配通常会使当前数组大小加倍。 外观如下:

您看到分配是通过一些额外的 space 完成的。

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

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

我们会看到这个:

更新#1

使用不安全指针分配也可以。主要缺点是手动内存管理:您必须显式释放它。

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

我这样做了:

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
}

Swift 3.1:

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
}