什么是'thunk'?

fbr*_*eto 123 c++ thunk

我已经看到它用于编程(特别是在C++领域)并且不知道它是什么.据推测它是一种设计模式,但我可能是错的.谁能举出一个很好的例子?

Chr*_*odd 120

A thunk通常是指一小段代码,它被称为一个函数,做一些小事,然后JUMPs到另一个位置(通常是一个函数),而不是返回给它的调用者.假设JUMP目标是正常函数,当它返回时,它将返回到thunk的调用者.

Thunk可用于有效地实现许多有用的东西

  • 协议转换 - 当从使用一个调用约定的代码调用到使用不同调用约定的代码时,可以使用a thunk来适当地转换参数.这仅在返回约定兼容时才有效,但通常情况就是如此

  • 虚函数处理 - 当在C++中调用乘法继承的基类的虚函数时,需要修复this指针以使其指向正确的位置.A thunk可以做到这一点.

  • 动态闭包 - 当你构建一个动态闭包时,闭包函数需要能够在创建它的上下文中获取.thunk可以构建一个小的(通常在堆栈上),它在一些寄存器中设置上下文信息,然后跳转到实现闭包函数的静态代码片段.这里的thunk实际上为函数提供了一个或多个隐藏的额外参数,这些参数不是由调用站点提供的.

  • 这是最好的解释,因为它解释了thunk*是*而不是通常*在典型用例中实现不同的东西*.其他答案过于关注那些特定的实现而不是一般的想法. (11认同)

Rob*_*vey 78

thunk这个词在计算机科学中至少有三个相关含义."thunk"可能是:

  • 一段代码来执行延迟计算(类似于闭包)
  • 一些虚函数表实现的功能(类似于包装函数)
  • 机器数据从一种特定于系统的形式到另一种形式的映射,通常是出于兼容性原因

我经常看到它在第三种情况下使用过.

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

  • 有趣; 我通常会听到第二种形式,但我想这取决于你经常做什么样的工作 (3认同)

Iva*_*ard 18

术语thunk最初是指Royal Radar Establishment在其Algol60编译器中实现名称传递所使用的机制.通常,它指的是在引用明显静态的对象时引发动态行为的任何方式.这个词是由Brian Wichmann发明的,当他被要求解释名字时说:"你出去从记忆中加载价值,然后突然 - 咚咚 - 你正在评估表达方式."

Thunk已被放入硬件中(参见KDF9,Burroughs大型机).有几种方法可以在软件中实现它们,特别是机器,语言和编译器.

该术语已经超越了名称,包括任何明显或名义上静态数据引用引起动态行为的情况.相关术语包括"蹦床"和"未来".

  • 谢谢你的词源.我讨厌编程术语,其定义似乎是表中的任意查找. (2认同)

Osc*_*Ryz 17

一些面向对象语言的编译器(如C++)生成称为"thunks"的函数,作为存在多个或虚拟继承时虚函数调用的优化.

摘自:http://en.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming


Jer*_*fin 7

使用方式有很大差异.几乎普遍地,thunk是一种功能(至少在概念上)非常小而且简单.它通常是某种适配器,为您提供正确的接口或某些东西(某些数据,其他功能等),但至少看起来没那么做.

它几乎就像一种语法糖,除了(至少通常使用的)语法糖应该使事物看起来像人类读者想要看到它们的方式,并且一个方法是使某些东西看起来像编译器想要的方式看见.

  • 对我而言听起来像语法糖的反面:) (2认同)
  • 那么编译器的语法糖呢?几乎,但并不完全不同于语法糖. (2认同)
  • 也许是一个语法灵魂人? (2认同)

Jon*_*vis 5

已经在SO上询问了此问题,请参见:

在Scheme或一般情况下,什么是“ thunk”?

据我所知,它类似于lambda语句,在这里您可能不希望返回值,直到需要评估它为止。或者也可以将其与属性获取器进行比较,该属性获取器在设计上执行一些代码以返回值,同时使接口形式更像是变量,但是具有可通过继承或继承交换出来的多态行为。通过换出将根据编译时或环境特征在运行时求值并返回值的函数指针。


Mus*_*sis 5

我要看一下,但我认为thunking是32位处理器用来运行传统16位代码的过程.

我过去常常用它来比喻你如何限制说话的速度以及与愚蠢的人交谈时使用的词语.

是的,这是在维基百科链接(关于32位的部分,而不是我的nerdalogy).

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

许多关于互操作性thunk的文献涉及各种Wintel平台,包括MS-DOS,OS/2,[8] Windows [9] [10]和.NET,以及从16位到32位内存寻址的转换.随着客户从一个平台迁移到另一个平台,对于支持为旧平台编写的遗留软件而言,thunk必不可少.

(我强调的是)


小智 5

我很苦恼地发现没有对这个术语的一般“计算机科学”定义与其历史上已知的事实上的用法相匹配。我记得第一次在现实生活中遇到它实际上是在 OS/2 天和 16-32 位转换中被调用。在今天的应用中,“thunking”似乎具有讽刺意味。

我粗略的理解是,thunk 是一个存根例程,它什么也不做,或者跨越系统之间的某些基本边界,如上述历史案例中所示。

因此,这种感觉就像是从一个环境掉到另一个环境中的联觉(比喻/作为明喻)发出“thunk”的声音。

  • 有趣的提示。我也想知道这个词的实际词源,我想象人们在玩“丛林电报”,其中一个人在流中默默地(在许多情况下是不知不觉地)在途中转换消息。 (2认同)