代码之家  ›  专栏  ›  技术社区  ›  fbrereto

什么是“thunk”?

  •  113
  • fbrereto  · 技术社区  · 15 年前

    我见过它在编程中使用(特别是在C++域),不知道它是什么。可能是设计模式,但我可能错了。有人能举一个打雷的好例子吗?

    9 回复  |  直到 7 年前
        1
  •  110
  •   GreatDane    9 年前

    thunk 通常是指作为函数调用的一小段代码,执行一些小的操作,然后 JUMP s返回到另一个位置(通常是函数),而不是返回到其调用方。假设跳转目标是一个正常的函数,当它返回时,它将返回到thunk的调用方。

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

    • 协议转换——从使用一个调用约定的代码调用到使用另一个调用约定的代码时, 臀部 可用于适当地转换参数。这只在返回约定兼容的情况下有效,但通常是这样的。

    • 虚函数处理——在C++中调用乘法继承基类的虚函数时,需要对 this 指向正确位置的指针。一 臀部 可以做到。

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

        2
  •  77
  •   Robert Harvey    15 年前

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

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

    我经常在第三个上下文中看到它的用法。

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

        3
  •  17
  •   OscarRyz    15 年前

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

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

        4
  •  16
  •   Ross Rogers    10 年前

    thunk一词最初指的是 Royal Radar Establishment 在其 Algol60 编译器。一般来说,它指的是在引用一个明显静态的对象时诱导动态行为的任何方法。这个术语是由BrianWichmann发明的,当他被要求解释pass-by-name时,他说:“好吧,你出去从内存中加载值,然后突然——砰——你正在评估一个表达式。”

    Thunk已经被安装在硬件上(参见kdf9,Burroughs主机)。有几种方法可以在软件中实现它们,都是机器、语言和编译器特有的。

    这个术语已经被泛化为超越pass-by-name,包括任何一种情况,在这种情况下,一个表面上或名义上的静态数据引用会引起动态行为。相关术语包括“蹦床”和“未来”。

        5
  •  7
  •   Jerry Coffin    15 年前

    使用上有相当大的差异。几乎是普遍的,thunk是一个非常小和简单的函数(至少在概念上)。它通常是某种适配器,为您提供与某个或其他对象(某些数据、另一个函数等)的正确接口,但至少被视为只做了很少的其他工作。

    它几乎是一种句法糖的形式,只是(至少和通常使用的一样)句法糖应该使事物看起来像人类读者想看到的那样,而thunk则是让事物看起来像编译器想看到的那样。

        6
  •  5
  •   Chad    9 年前

    我要查一下,但我想 雷鸣 是32位处理器用来运行旧的16位代码的进程。

    我曾经用它来比喻你如何限制你说话的速度,以及在和哑巴说话时用什么词。

    是的,它在维基百科链接中(关于32位的部分,不是我的 书呆子学 )

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

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

    (我强调)

        7
  •  4
  •   Community Mohan Dere    8 年前

    此问题已被问及,请参见:

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

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

        8
  •  4
  •   仁 人 卷    13 年前

    我很苦恼地发现,这个术语没有一个通用的“计算机科学”定义与我所知道的事实上的用法相匹配。我能回忆起的第一次真实的遭遇,是在OS/2天和16-32位转换中,它被实际调用的地方。“雷鸣”在今天的应用中似乎很讽刺。

    我大致的理解是,thunk是一个存根例程,它不做任何事情,或者像前面提到的历史案例中那样,以某种方式穿越系统之间的一些基本边界。

    所以这种感觉就像是从一个环境到另一个环境的联觉,发出“雷鸣”的声音(比喻/比喻)。

        9
  •  0
  •   Alex Gordon    7 年前

    Kyle Simpson's 定义,a 臀部 是一种抽象 时间 异步代码不足。