2009-05-05 16 views
45

Qualcuno potrebbe dirmi quale sia la capacità dello stack in C#.Capacità stack in C#

Sto cercando di formare un oggetto chiuso mesh 3D utilizzando una serie di 30.000 elementi.

+5

si può solo provare voi stessi mettendo bilioni di articoli su di esso e vedere quando si blocca? – Smashery

+0

Una domanda strettamente correlata è [Dimensione dello stack sotto Mono] (http://stackoverflow.com/questions/19817790/stack-size-under-mono). – Palec

risposta

67

La dimensione dello stack predefinita per un'applicazione .NET è 1 MB (l'impostazione predefinita è 256 KB per le applicazioni ASP.NET a 32 bit e 512 KB per le app ASP.NET a 64 bit), ma è possibile modificarla. Per l'applicazione è possibile modificare la dimensione predefinita modificando l'intestazione PE dell'eseguibile. Per i thread che crei, puoi utilizzare il sovraccarico del costruttore che accetta una dimensione dello stack.

Ma come sottolinea Anton Tyjhyy nella sua risposta, gli array sono tipi di riferimento e quindi si trovano nell'heap (anche se l'array è in grado di contenere un gruppo di tipi di valore).

+3

La dimensione di 256 KB per le applicazioni ASP.Net è per le applicazioni a 32 bit. Su Windows Server 2008 64 e versioni successive, la dimensione dello stack è stata aumentata fino a 512 KB. Vedere KB 932909 per ulteriori dettagli. – Dono

+0

@Dono Grazie per le informazioni. Aggiornerò –

+2

@BrianRasmussen È possibile allocare un array nello stack usando 'stackalloc'. Inoltre, solo perché qualcosa è un tipo di riferimento non significa necessariamente che sarà allocato nello stack o nell'heap, varia in base all'implementazione del CLR e nell'implementazione .NET varia in alcuni casi speciali (dimensione del tipo e scopo). –

50

L'array risiede nell'heap, le dimensioni dello stack sono irrilevanti nel tuo caso.

+4

Non se lo dichiarate con stackalloc ... – Nuzzolilo

4

Per utilizzare lo stack per la memorizzazione di un array, è necessario utilizzare un codice non sicuro con puntatori e stackalloc per allocare lo spazio di memoria desiderato nello stack.

3

Se si desidera verificare il valore per il proprio assieme .Net corrente, è possibile farlo utilizzando il comando ILDASM fornito con il prompt dei comandi di Visual Studio. Una volta avviato lo strumento, apri l'assieme e vai al menu View -> Headers. Ora scorri verso il basso fino alla sezione PE Optional Header (32 bit) nella finestra Headers appena aperta. Verrà visualizzato due campi:

  1. Dimensioni della riserva di stack - Questo è auto-esplicativo. Questa è la dimensione predefinita della memoria dello stack allocata a qualsiasi thread creato nel programma/applicazione.
  2. Dimensioni dello stack commettere - spazio dello stack commesso è - (citando Hans passant da here)

Tale spazio è riservato nel file di paging del sistema operativo in modo lo stack può sempre essere sostituita quando necessario .

enter image description here