我正在看这个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
变为handler
的this
指针,因此无需重新排列任何值,因此为什么要单独jmp
使用。
在中callback1
,必须handle()
先将参数重新排列到正确的CPU寄存器中,jmp
然后才能调用。
这与在各种调用约定中传递参数的工作方式有关。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句