我正在学习乐器所以我创建了一个简单的应用程序,让用户输入要分配的多个兆字节(MB)。我使用" 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函数之前:
因此,该函数根据需要分配大约22 MB而不是10 MB。我究竟做错了什么?或者这是额外的内存管理?
答案 0 :(得分:6)
在第一种情况下,当您在内部向数组追加字节时,它会在没有可用空间时使用重新分配。这种重新分配通常会使当前数组大小加倍。 以下是它的外观:
你看到分配是在一些额外的空间完成的。
如果我们改变你的功能来预分配内存:
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兆字节并将其提供给应用程序。
答案 1 :(得分:1)
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
}
答案 2 :(得分:0)
我这样做了:
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
}