Skip to content

提个建议 [不用汇编实现] #2

@Private0xCC

Description

@Private0xCC

用汇编实现,确实厉害

我最近一直在查阅资料,如何用c++实现 类似C#里面的委托
我们知道,成员函数与普通函数的其实是一样的,只是在调用的 时候,编译器会在参数列表最前面加上 void * const this 参数。
最大的问题就是 this 调整。我们知道,如果要调用基类的函数,this就需要指向派生类中包含的基类子对象。在单继承中,this不需要调整,如果是多继承或者虚继承,this是需要调整的。
c++ 的成员函数指针其实是一种结构体,其中包含了函数的实际地址,对于不同继承方式的类,它的成员函数指针需要附带额外的数据,多继承需要包含 delta ,表示 this 的调整值,虚继承需要包含 vtabel_index.这些附带数据,编译器会在通过函数指针调用的时候会通过这些数据对this做调整,多继承比较简单,直接 this += delta 既可以,虚继承因为情况比较多也比较复杂,我到目前为止还不知道所有的计算方式。
事实上,我们不需要关心怎么计算,我们只需要拿到 函数的实际地址和调整后的this,我们就可以把他当作 单继承类的成员函数 或者 普通的函数进行调用。
具体实现原理就是 ,拿到成员函数指针,替换 该结构中的函数实际地址为咱们自定义的一个函数,像这样:
class A
{
void * GetThis()
{
return this;
}
};
在函数调用的时候,编译器会先对this进行调整,然后再将调整后的this传给函数,替换函数地址后,通过成员函数指针调用函数,最终会 执行 A:GetThis ,而调用 该函数的 this 是编译器调整好的this,这样就达到了我们的目的,拿到调整后的this,拿到 实际函数地址。
对比楼主(不知道这么称呼合不合适。。。)的汇编实现,我的这种方式完全有c++代码实现。

有机会可以交流 291498682@qq.com
拿不到你的联系方式,只好这样。。。
https://github.com/wenchen1995/MemberFunctionPointer

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions