什么是“thunk”?
我已经看到它用于编程(特别是在C ++域),不知道它是什么。 据推测这是一种devise模式,但我可能是错的。 任何人都可以举一个thunk的好例子吗?
thunk
通常是指被称为函数的一小段代码,做一些小事情,然后JUMP
另一个位置(通常是一个函数),而不是返回给它的调用者。 假设JUMP目标是一个正常的函数,当它返回时,它将返回给thunk的调用者。
Thunk可以用来高效地实现许多有用的事情
-
协议转换 – 当从使用一个调用约定的代码调用使用不同调用约定的代码时,可以使用一个
thunk
来适当地转换该参数。 这只适用于返回约定是兼容的,但情况往往如此 -
虚拟函数处理 – 在C ++中调用多重inheritance基类的虚函数时,需要修改
this
指针,使其指向正确的位置。 一个thunk
可以做到这一点。 -
dynamic闭包 – 当你构build一个dynamic闭包时,闭包函数需要能够在创build它的上下文中获得。 可以构build一个小的
thunk
(通常在堆栈上),它在某些寄存器中设置上下文信息,然后跳转到一个实现闭包function的静态代码块。 这里的thunk有效地提供了一个或多个隐藏的额外的参数,而不是由调用网站提供的function。
thunk这个词在计算机科学中至less有三个相关的含义。 “thunk”可能是:
- 一段执行延迟计算的代码(类似于closures)
- 一些虚拟function表实现的function(类似于包装function)
- 通常为了兼容性原因,机器数据从一个系统特定的forms到另一个的映射
我通常看到它在第三方面使用。
一些面向对象语言(如C ++)的编译器生成称为“thunks”的函数,作为存在多个或虚拟inheritance时虚拟函数调用的优化。
取自: http : //en.wikipedia.org/wiki/Thunk#Thunks_in_object-oriented_programming
thunk这个术语最初是指皇家雷达机构在其Algol60编译器中实施通过名称的机制 。 一般而言,它指的是在引用一个明显静态的对象时引发dynamic行为的任何方式。 这个词是由Brian Wichmann发明的,当被要求解释通过名字的时候,他说:“你出去从内存中加载价值,然后突然 – thunk – 你正在评估一个expression。
Thunk被放入硬件(比较KDF9,Burroughs大型机)。 有几种方法可以在软件中实现它们,所有的机器,语言和编译器都是特定的。
这个术语已经被推广到超越名称之外,包括任何明显或名义上静态数据引用引起dynamic行为的情况。 相关术语包括“蹦床”和“未来”。
使用中有相当大的变化。 几乎普遍而言,thunk是一个(至less在概念上)exception小而简单的函数。 它通常是某种适配器给你正确的接口(某些数据,另一个function等等),但至less被认为是没有其他的东西。
这几乎就像一种语法糖,除了(至less通常使用的)语法糖应该让事情看起来像人类读者想要看到的一样,而一个重要的东西是让编译器想要的东西看见。
这个问题已经被问到了,请看:
在计划或一般情况下使用的“thunk”是什么?
从我所知道的情况来看,这与lambdaexpression式类似,在这种情况下,您可能不想返回值,直到需要评估为止。 或者也可以将它与一个属性获取器进行比较,该属性获取器通过devise执行一些代码以返回一个值,同时还具有更像variables的接口forms,但是也具有多态行为,可以通过inheritance通过交换函数指针,该函数指针将根据编译时或环境特征在运行时评估并返回一个值。
我很痛心地发现,这个术语没有一般的“计算机科学”定义,与历史上已知的事实上的用法相匹配。 我可以回想起第一次现实生活中,实际上被称为OS / 2天和16-32位转换的地方。 看来“thunking”在今天的应用上就像是讽刺。
我粗略的总体理解是,这个“残局”是一个残缺的例行公事,或者像上述的历史案例那样,只是在系统之间的某种根本的边界上做任何事情。
所以这种感觉就像是从一个环境下降到另一个环境的通感(比喻/作为一个明喻)“thunk”的声音。
我要去查看这个,但我认为thunking是32位处理器运行传统的16位代码的过程。
我曾经用它来比喻你如何限制你说话的速度,以及与愚蠢的人交谈时用什么语言。
是的,这是维基百科链接(关于32位,而不是我的nerdalogy )。
https://en.wikipedia.org/wiki/Thunk
许多关于互操作性的文献涉及到各种Wintel平台,包括MS-DOS,OS / 2,Windows [9] [10]和.NET, 以及从16位到32位内存寻址 。 随着客户从一个平台迁移到另一个平台,对于支持针对旧版平台编写的旧版软件来说,重要的是必不可less的。
(强调加我)