2015-09-11 21 views
6

Sto imparando gli strumenti quindi ho creato una semplice app che consente all'utente di inserire un numero di Mega Byte (MB) da allocare. E io uso lo strumento "Allocazioni" in Strumenti per assicurarmi che questa quantità esatta di dati sia allocata. Tuttavia, vedo sempre più memoria allocata in Strumenti di quanto mi aspetti.allocare una quantità specifica di memoria in swift - iOS

Ho fatto la seguente

func allocateMemoryOfSize(numberOfBytes: Int) { 

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

ho controllato molte domande e ho trovato un'alternativa utilizzando:

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

Ma ho ancora più memoria allocata. Ecco le restults degli strumenti quando ho stanziare 10 MB:

Prima di eseguire la funzione allocateMemoryOfSize:

Before: only 20.58 MB used

Durante lo svolgimento della funzione di: 44.96 MB utilizzati During: 44.96 MB used

Dopo l'esecuzione della funzione: di nuovo a soli 20,58 MB After: back to only 20.58 MB

Quindi, la funzione allocat es circa 22 MB non 10 come desiderato. Che cosa sto facendo di sbagliato? o questa roba di gestione della memoria extra?

risposta

6

Nel primo caso quando si aggiungono internamente i byte all'array viene utilizzata la ridistribuzione quando non c'è spazio libero. Questa riallocazione di solito raddoppia le dimensioni correnti dell'array. Ecco come appare:

enter image description here

si vede che l'assegnazione è stata fatta con un po 'di spazio aggiuntivo.

Se cambiamo funzione per preallocare memoria:

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

vedremo questo:

enter image description here

Update # 1

Assegnazione con puntatore pericoloso funzionerà anche. Il principale svantaggio è la gestione manuale della memoria: devi deallocarla in modo esplicito.

Informazioni sul riepilogo di allocazione: quando si alloca memoria, si verificano anche alcune allocazioni di sistema. Nel mio screenshot è possibile vedere che non solo 10 megabyte allocati con il chiamante swift.slowAlloc ma anche 8 megabyte con il chiamante _dispatch_alloc_try_create_heap. Quindi vedrai sul grafico che l'app usa 18 megabyte invece di 10. Non so perché questa allocazione di sistema avvenga anche perché è internals iOS. Penso che tu debba prestare attenzione solo alle tue allocazioni. Nel mio esempio vedo che sono stati richiesti 10 megabyte e dati all'app.

+0

Grazie mille, John! Ho solo un paio di commenti: 1- ha funzionato quando ho rimosso il ciclo for quando ho inserito 10 MB, allocati esattamente 10 MB. Con il ciclo for, ha allocato circa 15 MB. Probabilmente anche il ciclo for aveva bisogno di memoria. Quindi, ti suggerisco di rimuovere il ciclo for dalla tua risposta. 2- Capisco la tua spiegazione dell'allocazione dell'array, ma perché la chiamata di array mutabile non sicura ha allocato più memoria? Molte grazie! – CSawy

+0

Penso che il ciclo non influenzi l'allocazione. Ho aggiornato la mia risposta con alcune spiegazioni sul riepilogo dell'assegnazione. –

0

ho fatto questo:

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

Non posso che pensare a quanto amo Pascal: var Dati: PByte; Dati: = AllocMem (SomeByteSize); ZeroMemory (Data, SomeByteSize); :) –

0

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 
}