在C++实现回调(续)

来源:互联网 发布:java中自定义异常类 编辑:程序博客网 时间:2024/05/22 00:09

 

Method6:使用类的非静态函数作为回调(采用thunk的方法2)

在上面的实现过程中,可以看出来主要的部分就是这里:

        bMovEcx = 0xB9;       

        dwThis  = (DWORD)pThis;

        bJmp    = 0xE9;

        dwRealProc = DWORD((INT_PTR)proc - ((INT_PTR)this+sizeof(THUNK)));

意思就是Move Ecx pThis; 即把this指针保存到了ECX的寄存器,JMP dwRealProc;就是跳转到成员函数的地址并进行调用。

对于调用类的非静态方法时中需要传入this指针的问题,我们再找一种方法进行解决,上面的类方法使用的是默认的thiscall的调用规则,下面我们使用stdcall的方式,也就是不使用ecx传递this指针,而直接使用栈进行this指针的传递。见代码:

这里我们使用stdcall的约定定义函数方法,在调用的过程中在函数的参数列表的最左端添入一个this指针参数,也就是在栈的最下面,函数返回值之前加入this指针,达到可以调用的目的。

 

Method7:使用类的非静态函数作为回调(采用直接调用虚函数的方法)

其实这种方法跟上面的也类似,规避this指针的方法也是采用嵌入汇编的方式,将this指针赋值到ecx中。不过就是获取函数地址的方法有点不同了,上面都是使用pointer_cast<int>(&Test::Test2)这种方法,直接转化类的方法,这次我们将类函数的写成虚函数,通过虚函数表获取函数地址,进行调用。

 

 

PS:上面的代码中使用了两种方法获取函数的地址,好好琢磨一下吧~

 

Method8:使用类的非静态函数作为回调(采用成员函数指针的方法)

使用成员函数指针,不过这个弄的有点不像回调了,仅供参考吧:

 

 

 

Method9:使用类的非静态函数作为回调(采用FastDelegate)

很多大牛们早就开始研究这个问题了,解决方法也有很多,FastDelegate就是一个,可以参看下面的网址:

http://www.codeproject.com/KB/cpp/FastDelegate.aspx

当然中译本也有了,搜一下“成员函数指针与高性能的C++委托”就可以了,不多说了。

 

Method10:使用类的非静态函数作为回调(采用Tr1::function + bind)

C++ Technical Report 1 (TR1)ISO/IEC TR 19768, C++ Library Extensions(函式库扩充)的一般名称。TR1是一份文件,内容提出了对C++标准函式库的追加项目。这些追加项目包括了正则表达式、智能指针、哈希表、随机数生成器等。TR1自己并非标准,他是一份草稿文件。然而他所提出的项目很有可能成为下次的官方标准。这份文件的目标在于「为扩充的C++标准函式库建立更为广泛的现成实作品」。

C++ tr1是针对C++标准库的第一次扩展。即将到来的下一个版本的C++标准c++0x会包括它,以及一些语言本身的扩充。tr1包括大家期待已久的smart pointer,正则表达式以及其他一些支持范型编程的东东。草案阶段,新增的类和模板的名字空间是std::tr1

 

这个没怎么研究过,先列到这里,以后再慢慢研究~~

 

Method11:使用类的非静态函数作为回调(采用Boost::Function + bind)

BOOST库接触的比较少,也不敢多说啥,看到网上写的供给回调的方案有下面几种吧

Boost::Function + bind

Boost::Functor + Signal/Slot

Boost::lamda

大家可以研究一下,这个也以后再细细的说吧~

 

PS:大家可以看看下面的这个博客,讨论了一下各种方法的速度,没有具体考察过,大家权作参考吧~

http://www.cppblog.com/oldworm/archive/2011/01/30/139610.html

 

方法太多了,用的场合也多种多样,还要细细的研究啊~

回调,To be, or not to be...