如何解决回调函数中的参数顺序
我正在看这个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 z) {
static_cast<Handler *>(instance)->handle(x,y,z);
}
static void callback1(int x,int z,void *instance) {
static_cast<Handler *>(instance)->handle(x,z);
}
};
auto c0 = Handler::callback0;
auto c1 = Handler::callback1;
该代码产生以下程序集:
Handler::callback0(void*,int,int):
jmp Handler::handle(int,int)
Handler::callback1(int,void*):
mov r8d,edi
mov rdi,rcx
mov ecx,edx
mov edx,esi
mov esi,r8d
jmp Handler::handle(int,int)
c1:
.quad Handler::callback1(int,void*)
c0:
.quad Handler::callback0(void*,int)
很明显,这里是callback0的首选版本,但是我不知道callback1中“幕后”发生了什么?有人可以详细说明吗?
解决方法
在callback0()
中,参数按照handle()
期望的确切顺序通过CPU寄存器传递,其中instance
成为handler
的{ {1}}指针,因此不需要重新排列任何值,因此为什么this
会被自己使用。
在jmp
中,必须先将参数重新排列到callback1
所期望的正确CPU寄存器中,然后才能调用handle()
。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。