什么是'thunk'?

时间:2010-04-14 22:23:51

标签: c++ thunk

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

12 个答案:

答案 0 :(得分:114)

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

Thunks可以用来有效地实现许多有用的东西

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

  • 虚函数处理 - 在C ++中调用多重继承的基类的虚函数时,需要修复this指针才能使其指向右侧地点。 thunk可以执行此操作。

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

答案 1 :(得分:78)

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

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

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

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

答案 2 :(得分:17)

  

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

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

答案 3 :(得分:17)

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

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

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

答案 4 :(得分:7)

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

它几乎就像一种语法糖,除了(至少通常使用的)语法糖应该让事物看起来像人类读者想要看到它们的方式,并且thunk是让事物看起来像编译器希望看到它。

答案 5 :(得分: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非常重要。

(我强调)

答案 6 :(得分:4)

此问题已在SO上提出,请参阅:

What is a 'thunk', as used in Scheme or in general?

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

答案 7 :(得分:4)

我很遗憾没有发现这个术语的一般'计算机科学'定义与历史上已知的事实用法相匹配。第一次真实的遭遇我可以回想起它实际上被称为OS / 2天和16-32位过渡。看来“thunking”在今天的应用中就像讽刺一样。

我粗略的一般理解是thunk是一个存根例程,它在系统之间没有做任何事情或路由某些基本边界,如上述历史案例中那样。

所以这种感觉就像是从一个环境掉到另一个环境(隐喻/作为一个比喻)一个“thunk”声音的联觉。

答案 8 :(得分:1)

我知道的最早的“ thunk”用法是从50年代后期开始引用函数调用中的Algol60传递名称实参评估。 Algol最初是一种规范语言,而不是编程语言,并且有人对如何在计算机上实现“按名称传递”存在疑问。

解决方案是通过本质上是lambda的入口点。当被调用者评估该参数时,控制权就落空了! -在评估lambda的调用方上下文中,结果成为被调用方中参数的值。

在带标记的硬件(例如Burroughs机器)中,评估是隐式的:参数可以像普通传递值中那样作为数据值传递,或通过thunk传递名称中的传递,并带有不同的标记参数元数据。加载操作硬件检查了标签,并返回了简单值或自动调用了lambda thunk。

答案 9 :(得分:0)

Per Kyle Simpson's定义, thunk 是一种从异步代码中抽象 time 组件的方法。

答案 10 :(得分:0)

The New Hacker's Dictionary 的早期版本声称 thunk 是一个不带参数的函数,并且它是一个特别棘手的问题的简单深夜解决方案,“thunk”是“think”的假定过去式,因为他们早就应该想到它了。

答案 11 :(得分:0)

在OCaml中,它是一个以单元“()”为参数的函数(不带参数,常用于副作用)