Warum beträgt die C#-Stack-Größe immer noch 1 MB? Entdecken Sie die historischen und technischen Gründe
Da moderne PCs über ausreichend physischen Speicher verfügen, ist die Stapelgröße von C# bei 1 MB für 32-Bit-Prozesse und 4 MB für 64-Bit-Prozesse geblieben, was Fragen über die Logik hinter dieser scheinbar willkürlichen Grenze aufwirft.
Historische Ursprünge: Das Erbe von Windows NT
Die Standardstapelgröße von 1 MB wurde ursprünglich während der Entwicklung von Windows NT festgelegt. Wenn eine ausführbare Datei oder ein CreateThread()-API-Aufruf keine bestimmte Stapelgröße angibt, verwendet das Betriebssystem standardmäßig diesen Wert.
Gründe für die Wahl von 1 MB
Die Auswahl von 1 MB kann von verschiedenen Faktoren beeinflusst werden. Erstens stellte er in den frühen Tagen der Personalcomputer eine beträchtliche Menge an Speicher dar. Zweitens ermöglicht die Demand-Page-Architektur des virtuellen Speichers von Windows NT die virtuelle Zuweisung von Stapeln, wodurch ihre Auswirkungen auf den physischen Speicher minimiert werden.
Überbelegung von .NET-Programmen
Während 1 MB für anspruchsvolle native Programme in Ordnung sein mag, erweist es sich für .NET-Anwendungen als übertrieben. In .NET werden Zeichenfolgen und Arrays auf dem verwalteten Heap zugewiesen, wodurch der Stapelverbrauch reduziert wird. Darüber hinaus werden unsichere Zeiger und Stackalloc selten verwendet.
JIT-Kompilierung und Stack-Nutzung
Die einzige nennenswerte Stapelnutzung in .NET erfolgt während der Just-in-Time-Kompilierung (JIT) zur Laufzeit. Der Stack wird zur Codeoptimierung und Ausnahmebehandlung verwendet, benötigt jedoch typischerweise nur einige Zehntausend Bytes.
Stackbelegung
Eine Funktion von .NET besteht darin, dass der Stapel belegt ist, wodurch Platz in der Auslagerungsdatei für mögliche Auslagerungen reserviert wird. Dieser kostspielige Prozess wurde ursprünglich als Sicherheitsmaßnahme eingeführt, ist jedoch inzwischen veraltet.
Moderne Veränderungen: keine Stapelbelegung mehr
In neueren Versionen von .NET (ab etwa .NET 4.5) hat die CLR aus Leistungsgründen das Stack-Hogging abgeschafft. Durch diese Änderung wird der Einfluss der Stapelgröße auf die Speichernutzung weiter reduziert.
Fazit
Die Stapelgröße von 1 MB in C# ist ein historisches Artefakt, das von den Einschränkungen früher Computerplattformen beeinflusst wird. Angesichts der Fähigkeiten moderner Hardware mag es veraltet erscheinen, aufgrund seines relativ geringen Speicheraufwands und der ausreichenden Kapazität für die meisten Anwendungen ist es jedoch immer noch eine vernünftige Standardeinstellung.
Das obige ist der detaillierte Inhalt vonWarum beträgt die Standardgröße des C#-Stacks immer noch 1 MB (oder 4 MB für 64-Bit)?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!