Pergunta

Eu estava lendo alguns artigos na net sobre thunks VTable e eu li em algum lugar que thunks pode ser usado para procedimentos chamadas gancho / cadeia.

É alcançável?

Alguém sabe como isso funciona, também eu não sou capaz de encontrar bons recursos explicando thunks. Todas as sugestões para que?

Foi útil?

Solução

A implementação de uma conversão raw no estilo de thunks v-tabela é um último recurso. Tudo o que você precisa para realizar mais provável pode ser alcançado com uma função de invólucro, e será muito menos doloroso.

Em geral, uma conversão faz o seguinte:

  1. corrigir os parâmetros de entrada (por exemplo, converter para um formato diferente)
  2. Chame a verdadeira implementação
  3. Limpe o passo 1 / corrigir os parâmetros de saída

Para ver um exemplo de como isso funciona, vamos voltar ao nosso bom amigo Raymond Chen e sua discussão sobre thunks de ajuste:

http://blogs.msdn.com/oldnewthing /archive/2004/02/06/68695.aspx

A conversão ele usou foi a seguinte:

[thunk]:CSample::QueryInterface`adjustor{4}':
  sub     DWORD PTR [esp+4], 4 ; this -= sizeof(lpVtbl)
  jmp     CSample::QueryInterface

Como ele descreve, você tem uma classe que implementa os mesmos métodos através de múltiplas interfaces, por isso tem vários v-tabelas. (Se você não sabe COM, tudo que você precisa saber é que ele funciona com v-tabelas diretamente, portanto, um ponteiro para uma interface específica deve conter ponteiros de função a todos os métodos de que a interface , a fim .)

Se você implementar duas interfaces com diferentes métodos em um determinado slot, você precisa de múltiplas v-tabelas. Mas, você só escrever os métodos de sobreposição de uma vez, de modo que método precisa ser capaz de trabalhar com ambos "este" ponteiros. Para fazer isso, o compilador gera um método que faz a correção necessária e chama a implementação original.

Assim, esta conversão faz os seguintes passos:

  1. Corrija-se os parâmetros de entrada, ou seja, o ponteiro "este" escondido, na primeira linha.
  2. Chamada a implementação real na segunda linha.
  3. Limpeza: nenhum exigido (veja abaixo)

Este é o lugar onde a instrução jmp entra. Normalmente, se você fosse para chamar a função usando call, ele voltaria para você, e você teria que ret de volta para o seu interlocutor. Desde que não há nenhuma limpeza para fazer, o compilador faz uma otimização onde se move a execução direto para a implementação real e vamos retornar instrução de retorno real de implementação de o chamador. Esta é apenas uma otimização, não uma parte fundamental da thunking. Por exemplo, 16/32-bit thunks vai converter os parâmetros de entrada / saída entre 16 e 32 bits, conforme necessário, por isso, não pode ignorar o passo de limpeza; ele tem que call, não jmp.

A moral da história é: se você precisa fazer alguma coisa, como a otimização jmp, que você não pode escrever diretamente em C ++ ou sua outra linguagem de alto nível de escolha, vá em frente e escrever um thunk linguagem assembly. Caso contrário, basta escrever um wrapper e ser feito com ele.

Honestamente, parece que você está pedindo para a otimização de performance, e na maioria das vezes (1) o compilador é melhor para a otimização do que pensamos e (2) não é indo dar-lhe tão grande de uma melhoria como você pensa.

Outras dicas

Bem, você leu que thunks são uma solução, e agora você está procurando um problema para resolver?

Thunks, geralmente, são curtas funções "encaminhamento" que proporcionam menor - geralmente hardcoded -. Ajustes

pedaços VTable são muito bem explicado em wikipedia no momento. Eles usam o padrão comum: gerar uma pequena função para cálculo evitar / trabalho extra em tempo de execução

.

Outros lugares que eu vi / thunks usados:

Associando um identificador de janela com um objeto janela:. Para cada janela para ser uma subclasse, um pequeno conversão é gerado em tempo real que chama o processo de janela com a referência de objecto, a conversão é então utilizada como procedimento de janela

atrasar o carregamento DLLs:. A conversão torna-se a DLL é carregada pela primeira vez qualquer função é chamada

Trapping COM interface de chama: os thunks fornecer um ponto de injeção para diagnóstico, e salte para o método actual.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top