BT

Disseminando conhecimento e inovação em desenvolvimento de software corporativo.

Contribuir

Tópicos

Escolha a região

Início Notícias Futuro do C#: Delegados estáticos e ponteiros de função

Futuro do C#: Delegados estáticos e ponteiros de função

Favoritos

A cada nova versão do C#, a linguagem ganha mais recursos de baixo nível. Embora não sejam úteis para a maioria dos desenvolvedores de aplicativos de negócios, esses recursos permitem código de alto desempenho adequado para processamento de gráficos, aprendizado de máquina e pacotes matemáticos.

Nas próximas duas propostas, vemos novas maneiras de referenciar e invocar funções.

Delegates estáticos

Um delegate normal em C# é uma estrutura de dados um pouco complexa. Ele contém um ponteiro de função, uma referência de objeto opcional para esse parâmetro e um link para um delegate encadeado. Toda a estrutura é alocada em um heap como qualquer outro tipo de referência, com a pressão de memória correspondente. Além disso, sempre que é usado com código não gerenciado, ele precisa ser organizado.

Comparado a um delegate normal, um "delegate estático" é bastante simplificado. Ele é implementado como uma estrutura com um campo, um ponteiro de função do tipo IntPtr. Isso faz com que seja blittable, o que significa que ele tem exatamente o mesmo layout de memória quando usado em código gerenciado e não gerenciado. Ou, em outras palavras, o empacotamento não é necessário ao chamar uma função do sistema nativo.

É declarado usando esta sintaxe:

static delegate int Func()

Configurações adicionais, como conjunto de caracteres e convenção de chamada, podem ser especificadas usando um atributo semelhante ao atributo UnmanagedFunctionPointer.

Delegates estáticos possuem limitações. Eles só podem se referir a funções estáticas; membro de métodos em objetos não são permitidos porque não há lugar para armazenar o ponteiro para o objeto. Além disso, os delegates estáticos não podem ser encadeados a outros delegates.

No nível do CLR, um delegate estático é chamado usando a instrução calli (chamada indireta). Por outro lado, um delegate normal é chamado usando a instrução call ou callvirt (call virtual).

Para torná-lo mais compatível com o código existente, uma conversão implícita de um delegate estático para um delegate normal seria permitida. Indo na outra direção seria necessário um elenco explícito, pois nem todos os delegates normais atendem aos requisitos de um delegate estático.

Você pode ler mais sobre a proposta de Delegates estáticos no GitHub.

Ponteiros de Função

Uma proposta concorrente é simplesmente intitulada Ponteiros de Função. Isso também expõe a capacidade de usar a instrução calli e seu parceiro, a instrução ldftn (ponteiro do método de carregamento). Como a proposta anterior, começa com uma declaração de delegate. Embora neste caso, a palavra-chave delegate seja substituída por funcptr.

funcptr int F1(int value);

Ao invocar uma função nativa, o caller precisa saber qual é a convenção de chamada. Isso afeta coisas como a ordem dos itens na pilha e se o caller ou callee é responsável por limpar a pilha após o uso. As convenções de chamada abrangidas por esta proposta são cdecl, fastcall, stdcall, thiscall ou winapi. O desenvolvedor pode especificar qual usar, modificando a declaração do delegate:

funcptr cdecl int F1(int value);

Nesta proposta, os ponteiros de função só seriam permitidos em um contexto inseguro.

Como parte dessa proposta, poderia usar o operador de endereço (/) no nome de uma função para criar um ponteiro de função. Isso também só pode ser usado em um contexto inseguro.

As outras restrições em um ponteiro de função são as mesmas que um delegate estático. Especificamente, eles podem se referir apenas a funções estáticas e não podem ser encadeados a outros delegates.

Ambas as propostas estão sob consideração e não estão atualmente no roteiro C#. Uma terceira proposta intitulada Compiler Intrinsics também concorre com esses dois, mas tem limitações adicionais que a tornam menos atraente.

Avalie esse artigo

Relevância
Estilo/Redação

Conteúdo educacional

BT