asignar cantidad específica de memory en swift – iOS

Estoy aprendiendo instrumentos, así que creé una aplicación simple que permite al usuario ingresar una cantidad de Mega Bytes (MB) para asignar. Y uso la herramienta "Asignaciones" en Instrumentos para asegurarme de que se asigna esta cantidad exacta de datos. Sin embargo, siempre veo más memory asignada en los instrumentos de lo que espero.

Hice lo siguiente

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

Revisé muchas preguntas y encontré una alternativa usando:

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

Pero sigo recibiendo más memory asignada. Aquí está el repository en Instrumentos cuando asigno 10 MB:

Antes de ejecutar la function allocateMemoryOfSize:

Antes: solo se usan 20.58 MB

Durante el funcionamiento de la function: se utilizaron 44,96 MB Durante: 44.96 MB utilizados

Después de ejecutar la function: de nuevo a solo 20.58 MB Después: de vuelta a solo 20.58 MB

Por lo tanto, la function asigna alnetworkingedor de 22 MB, no 10 como se desee. ¿Qué estoy haciendo mal? ¿O es este extra de gestión de memory?

En el primer caso, cuando agrega bytes a su matriz internamente, utiliza la reasignación cuando no hay espacio libre. Esta reasignación generalmente duplica el tamaño de la matriz actual. Así es como se ve:

introduzca la descripción de la imagen aquí

Verá que la asignación se realizó con algo de espacio adicional.

Si cambiamos su function para preasignar memory:

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

Veremos esto:

introduzca la descripción de la imagen aquí

Actualización # 1

La asignación con puntero inseguro también funcionará. La principal desventaja es la gestión manual de la memory: debe desasignarla explícitamente.

Acerca del resumen de asignación: cuando asigna memory, también ocurren algunas asignaciones de sistema. En mi captura de pantalla se puede ver que no solo se asignan 10 megabytes con la persona que llama swift.slowAlloc sino también 8 megabytes con la persona que llama _dispatch_alloc_try_create_heap . Entonces verá en el gráfico que la aplicación usa 18 megabytes en lugar de 10. No sé por qué esta asignación de sistema también sucede porque es un componente interno de iOS. Creo que debes prestar atención solo a tus asignaciones. En mi ejemplo, veo que se solicitó y se administró 10 megabytes a la aplicación.

Hice esto:

 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 }