Von diesem Ссылка
Meine Frage ist In meinem c # -Programm (ich habe nur c # -Code mit Xaml-Dateien), welche Arten von Objekt wird zu verwalteten Heap und welche Arten zu native Heap geht? Und wie kann ich die maximale Größe jedes Heapspeichers angeben, wenn meine Anwendung ausgeführt wird? Ich nehme an, GC läuft nur auf verwalteten Heap, ist das richtig?
Wenn Sie ein Objekt mit dem neuen Operator in C # (oder dem entsprechenden Operator in einer anderen CLR-Sprache) erstellen, ordnet die .NET-Laufzeit Speicher im "verwalteten Heap" zu (einfach ein von der .NET-Laufzeitumgebung verwaltetes Heap) Müllsammler). Dies ist in Wirklichkeit eine von zwei Haufen - eine für Objekte mit einer Größe von weniger als 85K und die andere für Objekte, die größer sind als diese (große Arrays und dergleichen). Wie auch immer, wenn ein solches Objekt zugewiesen wird, erhalten Sie keinen echten Zeiger zurück, der die Adresse des zugewiesenen Speicherplatzes beschreibt, wie Sie es in nativem Code tun würden. Was Sie zurückbekommen, ist ein "Handle", das eine Indirektion zu dieser Speicheradresse darstellt. Diese Indirektion existiert, weil sich der tatsächliche Speicherort ändern kann, wenn der GC den Heap sammelt und komprimiert.
Wenn Sie mit nicht verwaltetem / nativem Code kommunizieren möchten, der einen Zeiger erwartet, müssen Sie jedoch Zeiger und keine Handles verwenden. .NET bietet zwei Methoden zum Konvertieren eines .NET-Handles in einen unformatierten Zeiger, der an nicht verwalteten Code übergeben werden kann.
Ich hoffe, das hilft!
Tags und Links c#