em princípio:
1. Semelhante aos modelos C++, a essência dos genéricos do C# é o tipo do tipo.
Ele define um tipo, e cada objeto instanciado dele é um tipo específico, por isso é chamado de tipo de tipo
2. É dividido em duas situações quando instanciado:
Tipos de referência e tipos de valor
Como o tipo de referência é essencialmente um ponteiro, que é um endereço de memória, o número de bytes usados pela variável de ponteiro é o mesmo em uma máquina com um determinado comprimento de bits. Por exemplo, uma máquina de 32 bits usa 4 bytes.
A essência dos genéricos é como um tipo de tipo definido. Após a compilação, haverá um código binário que descreve as características dessa definição de tipo, que é armazenado na memória.
Aqui descrevemos primeiro a definição de tipo e a alocação de memória de objetos instanciados após a compilação do código-fonte. Após a compilação do código-fonte, um arquivo de programa (como um arquivo exe) deve ser programado e carregado no espaço de memória durante a execução (sistema operacional moderno). usa mapeamento, ocupando memória logicamente, usando fisicamente o método de paginação, usando qual parte dos dados para transferir essa parte dos dados para a memória física);
Ao definir uma classe, a descrição da classe após a compilação (informações sobre quais membros de dados, quais funções de membro, respectivas permissões, etc.) faz parte do arquivo exe, que é carregado na memória após a execução. os dados binários são definidos no endereço da memória é 0x0001;
Ao instanciar um objeto de classe, isso depende da linguagem. Em C++, o objeto de instanciação de classe aloca memória na pilha; em C#, o objeto de instanciação de classe aloca memória no heap; espaço (como o sistema Windows de 32 bits, o espaço de memória do programa é 4G). Na memória restante diferente da memória mapeada pelo exe, quando o objeto instanciado excede o tempo de vida ou é liberado do heap, o espaço de memória é retornado. ao processo.
Da mesma forma, os dados binários codificados genéricos estão contidos no arquivo exe e carregados na memória.
Quando um genérico é instanciado, ou seja, quando um tipo específico é compilado (observe que o processo de instanciação de um genérico em C# é realizado durante a compilação, ou seja, o genérico instanciado usado no código, para cada tipo específico, binário o código é gerado durante a compilação e o código binário do próprio genérico é gravado no arquivo exe). Quanto espaço o código binário de cada tipo instanciado precisa ocupar no arquivo exe?
Em C#, precisamos distinguir entre tipos de referência e tipos de valor. Suponha que um genérico instancie dois tipos de referência e dois tipos de valor no código-fonte do programa.
Então, para tipos de referência:
Um usa um ponteiro de 4 bytes e dois usam dois ponteiros. Os dados binários apontam para o tipo usado (como myClass em vector<myClass>. myClass é um tipo de classe definido. Após a compilação, os dados binários são armazenados no arquivo exe. ) (o endereço relativo é convertido em um endereço de memória após ser carregado na memória). Isso ocorre porque o objeto instanciado do tipo de referência é alocado no heap e executado em tempo de execução, a partir do ponteiro O endereço obtém o binário. dados descritos pelo tipo myClass, calcula o espaço de memória ocupado por um objeto instanciado e o aloca no heap.
Para tipos de valor:
Os tipos de valor incluem estruturas e tipos de dados predefinidos. Ao instanciar genéricos com tais tipos (como vector<int>, vector<double>), os dados binários reais das duas classes serão gerados para representá-los. seus objetos no programa, é rápido (claro, também pode ser calculado e codificado em tempo de execução como uma referência), mas o tipo de valor é alocado na pilha e a flexibilidade é perdida para obter Eficiência, então execute assim)