2009-05-05 6 views
45

Könnte mir jemand sagen, was die Stapelkapazität in C# ist.Stapelkapazität in C#

Ich versuche ein geschlossenes 3D-Mesh-Objekt mit einem Array von 30.000 Elementen zu bilden.

+5

Man konnte es nur testen Sie sich von Billionen von Gegenständen auf sie setzen und sehen, wenn er abstürzt? – Smashery

+0

Eine nahe verwandte Frage ist [Stack size unter Mono] (http://stackoverflow.com/questions/19817790/stack-size-under-mono). – Palec

Antwort

67

Die Standardstapelgröße für eine .NET-Anwendung ist 1 MB (standardmäßig sind 256 KB für 32-Bit-ASP.NET-Anwendungen und 512 KB für 64-Bit-ASP.NET-Anwendungen), aber Sie können das ändern. Für die Anwendung können Sie die Standardgröße ändern, indem Sie den PE-Header der ausführbaren Datei ändern. Für Threads, die Sie erstellen, können Sie die Konstruktorüberladung verwenden, die eine Stapelgröße annimmt.

Aber wie Anton Tyjhyy in seiner Antwort darauf hinweist, sind Arrays Referenztypen und befinden sich daher auf dem Heap (selbst wenn das Array eine Menge von Werttypen enthält).

+3

Die Größe von 256 KB für ASP.Net-Anwendungen ist für 32-Bit-Anwendungen. Auf 64-Bit-Windows Server 2008 und höher wurde die Stackgröße auf 512 KB erhöht. Weitere Informationen finden Sie in KB 932909. – Dono

+0

@Dono Danke für die Info. Ich werde aktualisieren. –

+2

@BrianRasmussen Sie können mit 'stackalloc' tatsächlich ein Array auf dem Stack zuweisen. Nur weil etwas ein Referenztyp ist, bedeutet dies nicht notwendigerweise, dass es auf dem Stack oder dem Heap zugeordnet wird. Es variiert je nach Implementierung der CLR und in der .NET - Implementierung variiert es in einigen speziellen Fällen (Größe des Typs und Umfang). –

50

Ihr Array wird auf dem Heap leben, Stapelgröße ist in Ihrem Fall irrelevant.

+4

Nicht, wenn Sie es mit Stackalloc deklarieren ... – Nuzzolilo

4

Um den Stack zum Speichern eines Arrays zu verwenden, müssen Sie unsicheren Code mit Zeigern und stackalloc verwenden, um den gewünschten Speicherplatz auf dem Stack zuzuweisen.

3

Wenn Sie den Wert für Ihre aktuelle .Net-Assembly überprüfen möchten, können Sie dazu den Befehl ILDASM verwenden, der mit der Visual Studio-Eingabeaufforderung geliefert wird. Sobald Sie das Werkzeug gestartet haben, öffnen Sie Ihre Baugruppe und gehen Sie dann zu View -> Headers Menü. Scrollen Sie nun zum PE Optional Header (32 bit) Bereich im neu geöffneten Headers Fenster. Sie sehen zwei Felder:

  1. Größe der Stapelreserve - Dies ist selbsterklärend. Dies ist die Standard-Stack-Speichergröße, die jedem Thread zugewiesen wird, der in Ihrem Programm/Ihrer Anwendung erstellt wird.
  2. Größe des Stapels begehen - begangen Stapelraum - (Zitiert von Hans Passant von here)

der Raum in der Datei Betriebssystem-Paging reserviert ist so der Stapel immer dann notwendig, wenn ausgelagert werden kann, .

enter image description here