回调函数中的参数顺序

山原

我正在看这个C ++ Con演讲https://www.youtube.com/watch?v=e8SyxB3_mnw&t=2933s&ab_channel=CppCon,其中给出了类似以下代码的内容(https://godbolt.org/z/av4Tbn):

struct Handler {
  void handle(int x, int y, int z);

  static void callback0(void *instance, int x, int y, int z) {
    static_cast<Handler *>(instance)->handle(x, y, z);
  }

  static void callback1(int x, int y, int z, void *instance) {
    static_cast<Handler *>(instance)->handle(x, y, z);
  }
};

auto c0 = Handler::callback0;
auto c1 = Handler::callback1;

该代码产生以下汇编:

Handler::callback0(void*, int, int, int):
        jmp     Handler::handle(int, int, int)
Handler::callback1(int, int, int, void*):
        mov     r8d, edi
        mov     rdi, rcx
        mov     ecx, edx
        mov     edx, esi
        mov     esi, r8d
        jmp     Handler::handle(int, int, int)
c1:
        .quad   Handler::callback1(int, int, int, void*)
c0:
        .quad   Handler::callback0(void*, int, int, int)

显然,callback0是这里的首选版本,但是我不知道callback1中“幕后”发生了什么?有人可以详细说明吗?

雷米·勒博

在中callback0(),参数将按照handle()期望的确切顺序通过CPU寄存器传递,其中instance变为handlerthis指针,因此无需重新排列任何值,因此为什么要单独jmp使用。

在中callback1,必须handle()先将参数重新排列到正确的CPU寄存器中jmp然后才能调用。

这与在各种调用约定中传递参数的工作方式有关。

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

javascript / jQuery中的回调函数参数

来自分类Dev

Express Post函数中回调的执行顺序

来自分类Dev

给回调函数添加参数

来自分类Dev

如何在php的回调函数中传递参数?

来自分类Dev

了解匿名函数中的参数(回调示例)

来自分类Dev

将参数传递给JavaScript中的url回调函数

来自分类Dev

javascript回调函数中的参数从何而来?

来自分类Dev

(python)从回调中查找父函数的参数

来自分类Dev

localTodos应用程序的回调函数中缺少参数

来自分类Dev

Firebreath-回调函数中的传递参数

来自分类Dev

了解匿名函数中的参数(回调示例)

来自分类Dev

React_Redux:在连续回调函数期间在回调中传递参数

来自分类Dev

用作回调的Javascript函数触发顺序

来自分类Dev

回调函数以错误的顺序完成

来自分类Dev

C ++中的回调函数

来自分类Dev

Moongose中的回调函数

来自分类Dev

插件中的回调函数

来自分类Dev

TypeScript中的回调函数

来自分类Dev

GenServer中的回调函数

来自分类Dev

教堂中的回调函数

来自分类Dev

线程中的回调函数

来自分类Dev

nextAll()中的回调函数

来自分类Dev

Node.js中的回调顺序

来自分类Dev

Java回调函数作为参数

来自分类Dev

jQuery插件回调函数参数

来自分类Dev

传递参数和回调函数

来自分类Dev

如何为回调函数添加参数?

来自分类Dev

回调函数:不兼容的参数

来自分类Dev

如何使用带参数的回调函数?