在 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
}
我正在学习 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
}