Pergunta

Eu o vi usado na programação (especificamente no domínio C ++) e não tenho idéia do que é. Presumivelmente, é um padrão de design, mas eu poderia estar errado. Alguém pode dar um bom exemplo de thunk?

Foi útil?

Solução

UMA thunk Geralmente se refere a um pequeno pedaço de código que é chamado em função, faz algo pequeno e depois JUMPs para outro local (geralmente uma função) em vez de retornar ao seu chamador. Supondo que o alvo de salto seja uma função normal, quando retornar, ele retornará ao chamador do Thunk.

Thunks pode ser usado para implementar muitas coisas úteis com eficiência

  • Tradução de protocolo - ao ligar do código que usa uma convenção de chamada para codificar que usa uma convenção de chamada diferente, um thunk pode ser usado para traduzir os argumentos adequadamente. Isso só funciona se as convenções de devolução forem compatíveis, mas esse geralmente é o caso

  • Manuseio de funções virtuais-Ao chamar uma função virtual de uma classe base multiplica-se-herdada em C ++, é preciso haver uma fixação do this Ponteiro para apontar para o lugar certo. UMA thunk posso fazer isso.

  • Fechamentos dinâmicos - Quando você constrói um fechamento dinâmico, a função de fechamento precisa ser capaz de chegar ao contexto onde foi criado. Um pequeno thunk Pode ser construído (geralmente na pilha), que configura as informações de contexto em alguns registros (s) e, em seguida, pula para uma peça estática de código que implementa a função do fechamento. O Thunk aqui está fornecendo efetivamente um ou mais argumentos extras ocultos para a função que não é fornecida pelo site de chamadas.

Outras dicas

A palavra Thunk tem pelo menos três significados relacionados na ciência da computação. Um "Thunk" pode ser:

  • Um código de código para realizar um cálculo atrasado (semelhante a um fechamento)
  • Um recurso de algumas implementações da tabela de funções virtuais (semelhante a uma função de wrapper)
  • Um mapeamento de dados da máquina de um formulário específico do sistema para outro, geralmente por razões de compatibilidade

Eu geralmente vi isso usado no terceiro contexto.

http://en.wikipedia.org/wiki/thunk

Alguns compiladores para idiomas orientados a objetos, como o C ++, geram funções chamadas "Thunks" como uma otimização das chamadas de função virtual na presença de herança múltipla ou virtual.

Tirado de: http://en.wikipedia.org/wiki/thunk#thunks_in_object-oriented_programming

O termo thunk originalmente se referiu ao mecanismo usado pelo Estabelecimento de radar real implementação de passes por nome em seu Algol60 compilador. Em geral, refere -se a qualquer maneira de induzir um comportamento dinâmico ao fazer referência a um objeto aparentemente estático. O termo foi inventado por Brian Wichmann, que, quando solicitado a explicar o nome, disse: "Bem, você sai para carregar o valor da memória e, de repente - Thunk - lá você está avaliando uma expressão".

Thunks foram colocados em hardware (cf. KDF9, mainframes de Burroughs). Existem várias maneiras de implementá -las em software, todas específicas para máquinas, idiomas e compiladores.

O termo passou a ser generalizado além do nome, para incluir qualquer situação em que uma referência de dados aparentemente ou nominalmente estática induz um comportamento dinâmico. Os termos relacionados incluem "trampolim" e "futuro".

Há uma variação considerável no uso. Quase universalmente, um Thunk é uma função que é (pelo menos conceitualmente) incomumente pequena e simples. Geralmente, é algum tipo de adaptador que oferece a interface correta a algo ou outro (alguns dados, outra função etc.), mas é pelo menos visto como fazendo pouco mais.

É quase como uma forma de açúcar sintático, exceto que (pelo menos como geralmente usado) o açúcar sintático deve fazer as coisas parecerem da maneira que o leitor humano quer vê Veja.

Eu vou procurar isso, mas pensei bobando foi o processo empregado por um processador de 32 bits para executar o código de 16 bits.

Eu costumava usá -lo como uma analogia de como você tem para restringir a rapidez com que você fala e que palavras usa ao falar com pessoas idiotas.

Sim, está no link da Wikipedia (a parte de cerca de 32 bits, não meu nerdalogia).

https://en.wikipedia.org/wiki/thunk

Grande parte da literatura sobre interoperabilidade Thunks se refere a várias plataformas Wintel, incluindo MS-DOS, OS/2, [8] Windows [9] [10] e .NET, e para a transição do endereço de memória de 16 bits para 32 bits. Como os clientes migraram de uma plataforma para outra, Thunks tem sido essencial para apoiar o software legado escrito para as plataformas mais antigas.

(ênfase adicionada por mim)

Esta pergunta já foi feita em So, veja:

O que é um 'Thunk', como usado no esquema ou em geral?

Pelo que posso dizer, é semelhante a uma declaração Lambda, onde você pode não querer devolver o valor até precisar avaliá -lo; Ou também pode ser comparado a um getter de propriedade que, por design, executa algum código para retornar um valor e ainda ter o formulário de interface que se depara mais como uma variável, mas também possui comportamento polimórfico que pode ser trocado por herança ou Ao trocar o ponteiro da função que avaliaria e retornaria um valor em tempo de execução com base nas características de tempo de compilação ou ambientais.

Fiquei angustiado ao encontrar nenhuma definição geral de 'ciência da computação' desse termo correspondendo ao uso de fatores como conhecido historicamente para mim. O primeiro encontro da vida real que me lembro de onde foi chamado que estava no OS/2 dias e na transição de 16-32 bits. Parece que "ThuNking" é como ironia em sua aplicação hoje.

Meu entendimento geral difícil é que o Thunk é uma rotina de stub que simplesmente não faz nada ou rotas em algum limite fundamental em espécie entre os sistemas, como nos casos históricos mencionados.

Portanto, o sentido é como uma sinestesia de ser retirada do ambiente para o outro (metaforicamente/como um símile) um som "Thunk".

Por Kyle Simpson's definição, a Thunk é uma maneira de abstrair o componente de Tempo fora do código assíncrono.

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