我在编程中(特别是在C++领域)见过它的使用,但我不知道它是什么。可能它是一个设计模式,但我可能错了。能否给出一个好的thunk的例子?
Thunk
通常指的是一小段代码,作为函数调用时运行并完成一些小任务,然后跳转到另一个位置(通常是一个函数),而不是返回给调用者。假设JUMP目标是一个普通函数,当它返回时,它将返回给thunk
的调用者。
thunk
可以用于有效地实现许多有用的功能。
协议转换-- 当从使用一种调用约定的代码调用使用不同调用约定的代码时,可以使用thunk
适当地转换参数。这仅在返回约定兼容的情况下才有效,但通常如此。
虚函数处理-- 在C++中调用多重继承基类的虚函数时,需要修复this
指针以使其指向正确的位置。可以使用thunk
来完成此操作。
动态闭包-- 当构建动态闭包时,闭包函数需要能够获取创建它的上下文。可以构建一个小的thunk
(通常在堆栈上)来设置上下文信息到某个寄存器中,然后跳转到实现闭包函数的静态代码。这里的thunk
实际上为函数提供了一个或多个隐藏的额外参数,这些参数并没有由调用方提供。
thunk
,包括从本地ISO C++代码中导出函数以及所谓的“返回用户定义类型(UDT)”(似乎是用于调整运算符返回的用户定义类型的占位符,但我不确定如何生成它;我认为它已经过时了)。可能还有其他的一些,但可以肯定的是,Microsoft thunk
是无处不在的;笛卡尔会为此感到自豪。 - Justin Time - Reinstate Monica在计算机科学中,“thunk”这个词至少有三个相关的含义。一个“thunk”可能是:
我通常看到它被用在第三个上下文中。
Chris Dodds
的回答,但不是那么宽泛:它不仅包括延迟,而且包括任何“东西”。因此,在今天的时代,我猜测大多数人(网站开发人员)会认为 #1 是常见用法。 - Ben Butterworth在使用中存在相当大的差异。几乎普遍情况下,thunk是一个(至少在概念上)非常小而简单的函数。它通常是某种适配器,为您提供与某些数据、另一个函数等正确的接口,但至少被视为几乎不做其他事情。
这几乎像一种语法糖,只是(至少通常使用时)语法糖应该使事物看起来符合人类读者的期望,而thunk是为了使某些东西看起来符合编译器想要看到的方式。
我会去查一下,但我认为thunking是32位处理器运行传统16位代码的过程。
以前我常用它作为类比,说明当你和笨人说话时,必须限制讲话速度和使用词语。
是的,在维基百科链接中有提到(关于32位部分,而不是我的nerdalogy)。
许多关于互操作性的文献都与各种Wintel平台有关,包括MS-DOS,OS/2,Windows和.NET,以及从16位到32位内存寻址的过渡。随着客户从一个平台迁移到另一个平台,thunks对于支持为旧平台编写的遗留软件至关重要。