en principe:
1. Semblable aux modèles C++, l’essence des génériques C# est le type de type.
Il définit un type, et chaque objet instancié est un type spécifique, on l'appelle donc un type de type
2. Il se divise en deux situations lorsqu'il est instancié :
Types de référence et types de valeur
Étant donné que le type de référence est essentiellement un pointeur, qui est une adresse mémoire, le nombre d'octets utilisés par la variable pointeur est le même sur une machine avec une certaine longueur de bits. Par exemple, une machine 32 bits utilise 4 octets.
L'essence des génériques est en tant que type de type défini. Après compilation, il y aura un code binaire décrivant les caractéristiques de cette définition de type, qui est stocké en mémoire.
Ici, nous décrivons d'abord la définition du type et l'allocation de mémoire des objets instanciés après la compilation du code source. Une fois le code source compilé, un fichier programme (tel qu'un fichier exe) doit être programmé et chargé dans l'espace mémoire pendant l'exécution (système d'exploitation moderne). utilise le mappage, occupant logiquement la mémoire, utilisant physiquement la méthode de pagination, utilisant quelle partie des données transférer cette partie des données dans la mémoire physique);
Lors de la définition d'une classe, la description de la classe après compilation (informations sur les données membres, les fonctions des membres, les autorisations respectives, etc.) fait partie du fichier exe, qui est chargé dans la mémoire après l'exécution. les données binaires sont définies à l'adresse de la mémoire est 0x0001 ;
Lors de l'instanciation d'un objet de classe, cela dépend du langage. En C++, l'objet d'instanciation de classe alloue de la mémoire sur la pile ; en C#, l'objet d'instanciation de classe alloue de la mémoire sur le tas ; Espace (tel que le système Windows 32 bits, l'espace mémoire du programme est de 4 Go). Dans la mémoire restante autre que la mémoire mappée par l'exe, lorsque l'objet instancié dépasse la durée de vie ou est libéré du tas, l'espace mémoire est renvoyé. au processus.
De même, les données binaires codées génériques sont contenues dans le fichier exe et chargées en mémoire.
Lorsqu'un générique est instancié, c'est-à-dire lorsqu'un type spécifique est compilé (notez que le processus d'instanciation d'un générique en C# est effectué lors de la compilation, c'est-à-dire le générique instancié utilisé dans le code, pour chaque type spécifique, binaire le code est généré lors de la compilation et le code binaire du générique lui-même est écrit dans le fichier exe). Combien d'espace le code binaire de chaque type instancié doit-il occuper dans le fichier exe ?
En C#, nous devons faire la distinction entre les types référence et les types valeur. Supposons qu’un générique instancie deux types référence et deux types valeur dans le code source du programme.
Ensuite, pour les types de référence :
L'un utilise un pointeur de 4 octets et l'autre deux pointeurs. Les données binaires pointent vers le type utilisé (comme myClass dans vector<myClass>. myClass est un type de classe défini. Après compilation, les données binaires sont stockées dans un fichier exe. ) (l'adresse relative est convertie en adresse mémoire après avoir été chargée en mémoire). En effet, l'objet instancié de type référence est alloué sur le tas et exécuté au moment de l'exécution, à partir du pointeur L'adresse obtient le binaire. data décrites par le type myClass, calcule l'espace mémoire occupé par un objet instancié et l'alloue sur le tas.
Pour les types de valeur :
Les types de valeur incluent des structures et des types de données prédéfinis. Lors de l'instanciation de génériques avec de tels types (tels que vector<int>, vector<double>), les données binaires réelles des deux classes seront générées pour les représenter, de sorte que lors de l'instanciation. leurs objets dans le programme, c'est rapide (bien sûr, cela peut aussi être calculé et codé au moment de l'exécution comme une référence), mais le type de valeur est alloué sur la pile, et la flexibilité est perdue pour obtenir l'efficacité, alors exécutez comme ça)