回调函数的常见实现方式及速度比较

 

 

回调函数实在是用得太广泛,回调函数又有多种实现方式,如:

1、  静态函数

2、  虚函数

3、  函数对象

4、  传统c函数,通过一个void *传递对象地址,内部强制转换

5、  fastdelegate

6、  Tr1::function + bind

7、  Boost::Function + bind

基本上速度是按照由快到慢的顺序排列的,就是

1 > 2 > 3 > 4 > 5 > 6 > 7

其实234速度很接近,有的时候函数对象效率更高一点,基本上越是高级的方法使用起来越方便,但速度越慢,越是传统的方法速度越快,呵呵,看来做server端程序要综合考虑效率太新的东西还是要少用啊,还是用传统的方法比较靠谱一点,当然如果调用次数不多的地方,使用更方便的方法还是好一些,毕竟我们要综合权衡,而不能死板恪守教条。

 

 

Posted on 2011-01-30 11:19 袁斌 阅读(4488) 评论(3)  编辑 收藏 引用 所属分类: c++

Feedback

# re: 回调函数的常见实现方式及速度比较  回复  更多评论   

2011-01-30 22:59 by 欲三更
说起来是这些方法,但是在涉及到跨模块的时候,所有的模板方法都会有一定问题,然后虚函数,也就是接口的方法又不够灵活,最后,涉及到跨线程的时候,所有的方法都面临极大考验。

总结:
1.c++基本上就解决不了回调这个问题
2.c++鼓励源码级的复用,而不是二进制模块级的复用
3.c++还是不大适合多线程

PS:我记得还有一个cppsignal库和boost::signal也能用于这个功能。其实具体到一个领域,比如GUI,那么windows的消息机制其实是最好的。

# re: 回调函数的常见实现方式及速度比较  回复  更多评论   

2011-01-31 10:24 by 袁斌
@欲三更
基本不认同你的看法
1、c++解决回调问题还是很灵活的,以上方法都可用,还有更多的方法可用。
2、模块接口化或com化就可解决模块间复用问题,这已经是使用很广泛并且很容易使用的技术。
3、c++做多线程既高效又灵活,你看看有几个多线程程序不是用c/c++做的?apache nginx chrome ie qq explorer ...
signal我很少用,因为不够灵活且不是线程安全的,用起来不爽。
跨模块跨线程都不算是什么大问题,只要管好数据同步和控制同步即可,跟用什么方法回调没太大关系。

# re: 回调函数的常见实现方式及速度比较  回复  更多评论   

2011-01-31 22:53 by vczh
普通回调函数加上一个void*的参数就好了,譬如

class X
{
void InstallCallback(void(*callback)(void*,abcde));
void InvokeCallback(void* userdata);
};

只有注册用户登录后才能发表评论。
网站导航: 博客园   IT新闻   BlogJava   知识库   博问   管理