读fastdelegate和sigslot

本文探讨了fastdelegate和sigslot两种C++信号槽实现的差异。fastdelegate通过复杂的算法减少了内存消耗,但并未明显展示出速度优势。sigslot的运行机制相对直观,将对象指针和函数指针保存在链表中。尽管fastdelegate的模板实现令人困惑,其核心在于利用不同类型的函数指针之间的强制类型转换,使得它能够在8字节内完成bind操作。MFC的begin_message_map机制与此类似,为fastdelegate提供了实现基础。

分别来自与sourceforge和codeproject

sigslot的运行方式比较容易理解,就是将对象指针和函数指针保存到连表里,然后调用的时候再取出来执行

fastdelegate看他的文档看的一头雾水,看完了也没弄清楚作者说的为啥快和快到哪里去了,只是内存消耗确实变少了

因为他将所有的虚函数,多重继承等的this指针做了个复杂的取实际地址操作,所以他的一次bind只需要8个字节就够了

但是除内存外,没看到会比sigslot快

http://sigslot.sourceforge.net/

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

模板用多了真的很头疼,调试会很累的

 

fastdelegate算法异常复杂,他把普通函数和静态函数也通过一个horrible_cast封装到一个类,看得头晕

为了追求这么点内存,做了好大的工作啊


基于不同类型的函数指针可以强制类型转换,mfc的begin_message_map也是采用的这种方式,有了这个大杀器,fastdelegate才有了实现可能

float test3(int n,char *p)
{
return n;
}

typedef float (*MyFuncPtr)(int, char *);
MyFuncPtr my_func_ptr = &test3;


float n = my_func_ptr(1,0);
typedef float (*MyFuncPtr2)(int);
MyFuncPtr2 pts =(MyFuncPtr2) my_func_ptr;
n = pts(21);

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值