Lo stack di chiamate , la causa più comune di overflow dello stack , contiene un elenco di indirizzi di ritorno di ogni funzione o di un metodo di chiamata. Quando inizia il programma , lo stack di chiamate è vuota , allora quando la prima funzione viene chiamato, l' indirizzo della riga immediatamente dopo la chiamata di funzione viene spinto in pila. Quando la funzione completa , l'indirizzo di ritorno viene estratto dallo stack e l'esecuzione continua a questo indirizzo . Lo stack si espande e si comprime a seconda del numero di chiamate di funzioni nidificate .
Ricorsione
ricorsione si verifica quando una funzione richiama se stessa . Si consideri il seguente codice :
countNodes funzione ( nodo ) Per ogni childNode in nodenodeCount + = 1countNodes ( childNode ) Succ.Fine funzione
utilizzando una sorta di struttura ad albero come un documento XML , il codice conta il numero di nodi dell'albero trovati sotto un dato nodo . Ogni nodo figlio viene contato , poi viene passato nella stessa funzione per contare i propri nodi figli . Questo continua fino a quando un bambino non ha figli
Supponiamo che il programmatore nodo tipizzata invece di nodo figlio come segue : .
CountNodes funzione ( nodo ) Per ogni childNode in nodenodeCount + = 1countNodes ( Node ) Succ.Fine funzione
In questo caso, la funzione chiamerà se stesso a tempo indeterminato e un overflow dello stack si verifica .
Nascosto ricorsione
Nella maggior parte dei casi , Gli sviluppatori non stanno scrivendo intenzionalmente codice ricorsivo , ma ricorsione possono verificarsi in modi più sottili . Considerate queste tre funzioni:
Funzione loadAccount ( ) LoadMainAccount ( ) loadTransactions ( ) End Function
Funzione loadMainAccount ( ) loadAssociatedAccounts () la funzione
funzione
fine loadAssociatedAccounts ( ) loadAccount ( ) end Function
In questo caso , la ricorsione indiretta si verifica quando una funzione chiama un'altra funzione che chiama inavvertitamente la prima funzione . Il risultato può prendere un po 'di più , ma il risultato è un overflow dello stack .
Parametri Grandi
Oltre tracciamento funzione punti di ritorno di chiamata , la pila può anche contenere altri dati . La maggior parte delle lingue usa lo stack per contenere i parametri di funzione e questi sono di solito solo affrontare puntatori delle posizioni dei parametri. Alcune lingue spingono parametri per valore nello stack e questo può richiedere molto più spazio . La dimensione dello stack di default per la maggior parte delle lingue variare da 512 K a 1 MB, così grandi parametri passati per valore potevano occasionalmente causare un overflow dello stack . Se vi è la necessità di passare grandi parametri per valore , consultare il manuale di riferimento di lingua per determinare come aumentare lo stack .
Variabili di istanza
variabili di istanza
sono quelli incorporati all'interno della funzione . Per esempio :
campione di funzione ( ) N = GetCounter ( ) Return n * 12End funzione
La variabile n è una variabile di istanza , poiché esiste solo mentre il campione funzione esegue . In molte lingue , n viene inserito nello stack , poi spuntato fuori quando la funzione termina. Questo funziona bene per le variabili semplici come numeri interi e caratteri , ma può riempire lo stack quando si utilizzano matrici di grandi dimensioni . Quando questo diventa un problema , è possibile utilizzare built-in strutture di dati come stringhe o elenchi . Queste strutture solitamente allocano memoria nello heap , una , molto più grande area di memoria separata .
Programmazione © www.354353.com