2012-12-22 20 views
5

Desidero informazioni accurate sullo stack overflow in VC++ (32 bit e 64 bit) e specialmente in ricorsione. In modalità Debug, questo accade così presto in ricorsione (come 4500 esecuzione di una semplice funzione ricorsiva non fare nulla o simili). Tuttavia, sembra che la modalità di rilascio sia diversa. È stato difficile da capire, e non l'ho ancora testato, perché l'ottimizzazione cancella il codice che non fa nulla (apparentemente rimuove la ricorsione), dato che il mio codice o la mia funzione erano così .. Dovrei fare di più .. Misuro il momento giusto nel rilascio ottimizzato, non so se l'ottimizzazione faccia lo stesso in un ordinamento più complesso e rapido implementato dalla ricorsione?qual è la dimensione dello stack in VC++?

Grazie!

risposta

7

Come Andreas Brinck states in his related answer:

In VC++ la dimensione di stack predefinita è 1 MB Credo, quindi con una ricorsione profondità di 10.000 ogni stack frame può essere al massimo di ~ 100 byte.

Questo limite di dimensione dello stack possono essere modificati utilizzando:

Progetto → Proprietà → Proprietà di configurazione → Linker → Sistema → Pila Reserve Size.

Project → Properties → Configuration Properties → Linker → System → Stack Reserve Size.

+0

ha funzionato, grazie, ha bisogno di ricostruzione dopo la configurazione. Grazie! – user683595

+0

Siete i benvenuti !! Non dimenticare di accettare la risposta. Buon Natale!! –

+0

Primo paragrafo copiato verbatim da [C/C++ dimensione massima dello stack del programma] (http://stackoverflow.com/q/1825964) –

0

si può fare ogni ricorsivo algoritmo iterativo per esempio con uno stack separato.

1

L'opzione per la dimensione dello stack in VC++ è situato in,

Properties -> Configuration Properties -> Linker -> System -> Stack Reserve Size. 
0

rafforzando nel contempo la pila non è una pessima idea, stackspace non è infinita, e come avrete probabilmente notato, a corto di pila non è facilmente recuperabile. Se DEVI usare le funzioni ricorsive che ricorrono a diverse migliaia di livelli, allora con ogni mezzo aumenta lo stack.

Per sicurezza, assicurarsi di testare il livello di ricorsione sicuro massimo e quindi avere un limite nella propria funzione [anche nel codice di produzione, anche se lo rende un po 'più lento e occupare più spazio nello stack] . Altrimenti, puoi scommettere che qualcuno, da qualche parte, userà il tuo codice in un modo che non avevi previsto, e avrà un crash quando eseguirà alcuni livelli più in profondità nella ricorsione di quanto avevi previsto - kablam, nessun recupero possibile.

Un'altra possibile soluzione è eseguire la ricorsione in un thread separato, e se quel thread si blocca, hai ancora il thread principale da ripristinare in caso di crash in modo sano (se non altro, semplicemente per registrare il fatto che il tuo il codice si è arrestato in modo anomalo con uno stack fallito e quali erano le circostanze).

Preferirei sicuramente avere un livello di ricorsione non ricorsivo, o almeno limitato, e utilizzare altri meccanismi, come la struttura di dati lifo allocata dinamicamente per registrare "dove siamo noi".

Problemi correlati