2010-03-31 10 views
23

Ho un programma che fa chiamate ricorsive per 2 miliardi di volte e lo stack overflow. Apporto le modifiche e quindi ho ancora bisogno di 40 ricorsive chiamate. Quindi ho probabilmente bisogno di diversi MB di memoria dello stack. Ho sentito che la dimensione dello stack è predefinita a 1 MB. Ho provato la ricerca online. Qualcuno ha detto di andare in proprietà -> linker ......... in Visual Studio, ma non riesco a trovarlo.Come modificare le dimensioni dello stack per un programma .NET?

Qualcuno sa come aumentarlo? Inoltre mi chiedo se posso impostarlo da qualche parte nel mio programma C#?

P.S. Sto usando winXP a 32 bit e win7 a 64 bit.

risposta

32

Il modo più semplice per impostare la dimensione dello stack da .NET 2.0 e Win XP è in poi per deporre le uova un nuovo thread con la dimensione dello stack che desideri: -

using System.Threading; 

Thread T = new Thread(threadDelegate, stackSizeInBytes); 
T.Start(); 

Per cambiare la dimensione dello stack del tutto il programma che avrebbe dovuto usare Editbin: -

EDITBIN.EXE /STACK:<stacksize> file.exe 
+2

Per coloro che utilizzano la route di modifica, è necessario scaricare il set di strumenti Visual C++ nel programma di installazione di Visual Studio. Puoi anche inserirlo nei tuoi passi di costruzione del post come "EDITBIN.EXE/STACK: $ (NomeDestinazione)' –

+0

@CameronAavik Aggiungendo al tuo commento, avevo bisogno di aggiungere la cartella degli strumenti SDK al mio percorso, riavviare Visual Studio per vedere questo cambia, e usa '$ (TargetPath)' invece di '$ (TargetName)'. –

10

Molto probabilmente dovresti provare a utilizzare i loop anziché la ricorsione.

+7

+1, 2 miliardi di chiamate ricorsive è un po 'eccessivo. –

+0

Siamo un po 'più precisi: il problema non è tanto la ricorsione * di per sé *, quanto il numero di iterazioni (dopotutto, ci saranno ancora 2 miliardi di iterazioni dopo la conversione in un ciclo). Il vero problema è che il compilatore potrebbe non generare chiamate tail; solo per questo motivo la ricorsione combinata con l'alto numero di iterazioni diventa problematica. – stakx

16

Non è disponibile un'opzione per il compilatore. È possibile edit it after the fact using editbin /stack oppure creare un thread separato per l'algoritmo e specificare una dimensione di stack maggiore nello Thread constructor.

Detto questo, potresti voler appiattire la tua funzione ricorsiva ... Se stai avendo degli overflow di stack ora, è difficile sapere che qualsiasi dimensione di stack sarà appropriata a lungo termine. Questa è solo una soluzione di cerotto.

0

so che in VS è possibile impostare una dimensione dello stack arbitraria (EDIT: per programmi C++). Tuttavia, ti suggerisco di utilizzare una coda (cioè, restituire MyFunc (args);) che ricicla automaticamente lo spazio dello stack. Quindi, dovresti utilizzare un oggetto con allocazione heap per mantenere lo stato.

+0

In generale, non penso che i compilatori .NET ottimizzeranno una chiamata ricorsiva in coda. Almeno, C# e VB.NET no. – user1172763

Problemi correlati