grundsätzlich:
1. Ähnlich wie bei C++-Vorlagen ist die Essenz der C#-Generika der Typtyp.
Es definiert einen Typ, und jedes instanziierte Objekt davon ist ein bestimmter Typ, daher wird es als Typtyp bezeichnet
2. Bei der Instanziierung wird es in zwei Situationen unterteilt:
Referenztypen und Werttypen
Da der Referenztyp im Wesentlichen ein Zeiger ist, bei dem es sich um eine Speicheradresse handelt, ist die Anzahl der von der Zeigervariablen verwendeten Bytes auf einer Maschine mit einer bestimmten Bitlänge dieselbe. Beispielsweise verwendet eine 32-Bit-Maschine 4 Bytes.
Das Wesentliche an Generika ist, dass nach der Kompilierung ein Binärcode vorliegt, der die Eigenschaften dieser Typdefinition beschreibt und im Speicher gespeichert wird.
Hier beschreiben wir zunächst die Typdefinition und Speicherzuweisung von instanziierten Objekten nach dem Kompilieren des Quellcodes. Nachdem der Quellcode kompiliert wurde, muss eine Programmdatei (z. B. eine EXE-Datei) programmiert und während der Ausführung in den Speicherbereich geladen werden (modernes Betriebssystem). verwendet Mapping, belegt den Speicher logisch, verwendet die Paging-Methode und verwendet den Teil der Daten, um diesen Teil der Daten in den physischen Speicher zu übertragen.
Beim Definieren einer Klasse bildet die Beschreibung der Klasse nach der Kompilierung (Informationen darüber, welche Datenmitglieder, welche Mitgliedsfunktionen, jeweilige Berechtigungen usw.) einen Teil der exe-Datei, die nach der Ausführung in den Speicher geladen wird Binärdaten werden an der Speicheradresse 0x0001 festgelegt.
Bei der Instanziierung eines Klassenobjekts kommt es auf die Sprache an. In C++ weist das Klasseninstanziierungsobjekt Speicher auf dem Heap zu. Speicherplatz (z. B. Windows 32-Bit-System, der Programmspeicherplatz beträgt 4 GB) Im verbleibenden Speicher außer dem von der Exe zugeordneten Speicher wird der Speicherplatz zurückgegeben, wenn das instanziierte Objekt die Lebensdauer überschreitet oder aus dem Heap freigegeben wird zum Prozess.
Ebenso sind die generisch codierten Binärdaten in der Exe-Datei enthalten und werden in den Speicher geladen.
Wenn ein Generikum instanziiert wird, das heißt, wenn ein bestimmter Typ kompiliert wird (beachten Sie, dass der Prozess der Instanziierung eines Generikums in C# während der Kompilierung ausgeführt wird, d Der Code wird während der Kompilierung generiert und der Binärcode des Generikums selbst wird in die Exe-Datei geschrieben. Wie viel Platz muss der Binärcode jedes instanziierten Typs in der Exe-Datei belegen?
In C# müssen wir zwischen Referenztypen und Werttypen unterscheiden. Angenommen, ein Generikum instanziiert zwei Referenztypen und zwei Werttypen im Quellcode des Programms.
Dann für Referenztypen:
Einer verwendet einen 4-Byte-Zeiger und zwei verwenden zwei Zeiger. Die Binärdaten zeigen auf den verwendeten Typ (z. B. myClass in vector<myClass>. myClass ist ein definierter Klassentyp. Nach der Kompilierung werden die Binärdaten in der EXE-Datei gespeichert ) (Die relative Adresse wird nach dem Laden in den Speicher in eine Speicheradresse umgewandelt. Dies liegt daran, dass das instanziierte Objekt des Referenztyps auf dem Heap zugewiesen und zur Laufzeit vom Zeiger ausgeführt wird. Die Adresse erhält die Binärdatei Die vom Typ myClass beschriebenen Daten berechnen den von einem instanziierten Objekt belegten Speicherplatz und weisen ihn dem Heap zu.
Für Werttypen:
Zu den Werttypen gehören Strukturen und vordefinierte Datentypen mit solchen Typen (z. B. vector<int>, vector<double>), sodass bei der Instanziierung tatsächliche Binärdaten der beiden Klassen generiert werden Ihre Objekte im Programm sind schnell (natürlich können sie auch zur Laufzeit wie Referenzen berechnet und codiert werden), aber der Werttyp wird auf dem Stapel zugewiesen, und die Flexibilität, die zum Erreichen von Effizienz erforderlich ist, geht verloren. Daher wird er ausgeführt so was)