当前位置:首页 » 编程博文
开发技术指南» 文章正文
    引言: 成员函数指针与高性能的C++委托(上篇) Member Fun
 

 

 ·为什么flush不生效?    »显示摘要«
    摘要:老早就看了这篇文章: 类似socket传输的flush() 非常简单的代码,却总是不能在我的服务器上正常运行,如下:代码片段: for($i = 1; $i 500; $i++)print " ";????ob_implicit_flush();????for($j = 1; $j 30; $j++) {????echo $j."";????sleep(1)......
 ·pear帮助手册的chm版    »显示摘要«
    摘要:在pear的站点上看到有chm版本的手册下载了,我想这东东以后会和php手册,mysql手册,js手册一起,常备俺的案头,时时不忘拿出来翻阅一番: 下载地址 ......


成员函数指针与高性能的C++委托(上篇)
成员函数指针与高性能的c++委托(上篇)

【程序编程相关:注册表

member function pointers and the fastest possible c++ delegates 【推荐阅读:如何分屏幕(How to split t

翻译:周翔 【扩展信息:在 Linux 下使用优盘。

撰文:don clugston

引子

标准c++中没有真正的面向对象的函数指针.这一点对c++来说是不幸的,因为面向对象的指针(也叫做“闭包(closure)”或“委托(delegate)”)在一些语言中已经证明了它宝贵的价值.在delphi (object pascal)中,面向对象的函数指针是borland可视化组建库(vcl,visual component library)的基础.而在目前,c#使“委托”的概念日趋流行,这也正显示出c#这种语言的成功.在很多应用程序中,“委托”简化了松耦合对象的设计模式[gof].这种特性无疑在标准c++中也会产生很大的作用.

很遗憾,c++中没有“委托”,它只提供了成员函数指针(member function pointers).很多程序员从没有用过函数指针,这是有特定的原因的.因为函数指针自身有很多奇怪的语法规则(比如“->*”与“.*”操作符),而且很难找到它们的准确含义,并且你会找到更好的办法以避免使用函数指针.更具有讽刺意味的是:事实上,编译器的编写者如果实现“委托”的话会比他费劲地实现成员函数指针要容易地多!

在这篇文章中,我要揭开成员函数指针那“神秘的盖子”.在扼要地重述成员函数指针的语法与特性之后,我会向读者解释成员函数指针在一些常用的编译器中是怎样实现的,然后我会向大家展示编译器怎样有效地实现“委托”.最后我会利用这些精深的知识向你展示在c++编译器上实现优化而可靠的“委托”的技术.比如,在visual c++(6.0, .net, and .net 2003)中对单一目标委托(single-target delegate)的调用,编译器仅仅生成两行汇编代码!

函数指针

下面我们复习一下函数指针.在c与c++语言中,一个命名为my_func_ptr的函数指针指向一个以一个int与一个char*为参数的函数,这个函数返回一个浮点值,声明如下:

float (*my_func_ptr)(int, char *);

//为了便于理解,我强烈推荐你使用typedef关键字.

//如果不这样的话,当函数指针作为一个函数的参数传递的时候,

// 程序会变得晦涩难懂.

// 这样的话,声明应如下所示:

typedef float (*myfuncptrtype)(int, char *);

myfuncptrtype my_func_ptr;

应注意,对每一个函数的参数组合,函数指针的类型应该是不同的.在microsoft visual c++(以下称msvc)中,对三种不同的调用方式有不同的类型:__cdecl, __stdcall, 与__fastcall.如果你的函数指针指向一个型如float some_func(int, char *)的函数,这样做就可以了:

my_func_ptr = some_func;

当你想调用它所指向的函数时,你可以这样写:


...   下一页
 ·等待pear投票的模板程序html    »显示摘要«
    摘要:在zend.com上看到这个模板程序,咋一看结构代码都很像smarttemplate,但是细看处理方法却是截然不同,模板程序中都是直接使用的php代码,如下面这段常见的循环显示代码:代码片段: foreach ($book as $key => $val): ?>???????????echo $val[´author´] ?>???????echo $val[´......
» 本期热门文章:

©2000-2007 All Rights Reserved. 最佳浏览:1024X768 MSIE