2016-01-25 12 views
6

Nella seguente procedura, la matrice verrà allocata nello stack?Variabili locali: sono sempre in pila?

procedure One: 
var 
    arr: array[0..1023] of byte; 
begin 
end; 

Qual è l'articolo più grande che può andare in pila?

C'è una differenza di velocità tra l'accesso alla variabile nello stack e nell'heap?

risposta

9

Nella seguente procedura, la matrice verrà allocata nello stack?

Sì, a condizione che la variabile locale non venga acquisita da un metodo anonimo. Tali variabili locali risiedono nell'heap.

Qual è l'articolo più grande che può andare in pila?

Dipende dall'ampiezza dello stack e dalla quantità di stack già utilizzata e dalla quantità di stack utilizzata dalle chiamate effettuate dalla funzione stessa. Lo stack è una dimensione fissa, determinata al momento della creazione del thread. Lo stack trabocca se cresce oltre quella dimensione. Almeno su Windows, la dimensione dello stack predefinita è 1MB, quindi non mi aspetto che tu incontri problemi con un array da 1KB come si può vedere qui.

C'è una differenza di velocità tra l'accesso alla variabile nello stack e nell'heap?

In linea di massima no, ma di nuovo questo dipende. Probabilmente è più probabile che le variabili in pila siano accessibili frequentemente, e quindi probabilmente più facili da memorizzare nella cache. Ma per un oggetto di dimensioni decenti, come l'array 1KB che possiamo vedere qui, non mi aspetto che ci sia alcuna differenza nel tempo di accesso. In termini di architettura di memoria sottostante, non c'è differenza tra stack e heap, è tutto solo memoria.

Ora, dove c'è una differenza nelle prestazioni è in allocazione. L'allocazione dell'heap è più costosa dell'assegnazione dello stack. E soprattutto se si dispone di un'applicazione multi-thread, l'allocazione dell'heap può essere un collo di bottiglia. In particolare, il gestore di memoria Delphi predefinito non si adatta bene all'utilizzo multi-thread.

+2

FWIW nella procedura precedente, non ci sarà nulla nello stack perché la variabile verrà rimossa dal compilatore poiché non viene utilizzata. Quindi dipende dall'implementazione di detta procedura. Di solito, sì, le variabili locali sono in pila, a meno che non vengano catturate da un metodo anonimo - in tal caso si trovano nell'heap come parte dell'istanza dell'oggetto che esegue il backup del metodo anonimo. –

+0

Thanbks David e Stefan, questo è praticamente quello che pensavo (ma non avevo considerato i tempi di allocazione, né l'implementazione più esoterica suggerita da Stefan. –

+0

Prenderò nota/attenzione, se stai andando in questa direzione, che i 64 il compilatore a bit, per la cronologia, non rimuove le variabili inutilizzate per la maggior parte del tempo ... dovremmo tutti lamentarci con EMBC. Inoltre, si noti che è possibile regolare la dimensione dello stack predefinita nelle opzioni del progetto. " –