LinuxSir.cn,穿越时空的Linuxsir!

 找回密码
 注册
搜索
热搜: shell linux mysql
查看: 986|回复: 5

[效率!效率!] 如何强制指定在把函数指针作为参数时启用内联?

[复制链接]
发表于 2005-11-5 17:43:52 | 显示全部楼层 |阅读模式
我是用纯C99来写一个字符串数组排序程序的,C99有个特性是可以指定函数内联以减小调用开销,程序中的关键语句如下:

#include <stdlib.h>
#include <string.h>
char* pStrs[1000000]; //里面全部存满了字符串(乱序)
qsort(pStrs,1000000,sizeof(char*),strcmp);
//现在pStrs有序了

在继续前,请先看一下这篇文章:
http://stl.winterxy.com/html/item_46.html
请注意其中的两段话:
-----------------------
因为comp是一个指向函数的指针,每次在sort中用到时,编译器产生一个间接函数调用——通过指针调用。大部分编译器不会试图去内联通过函数指针调用的函数,甚至,正如本例中,那个函数已经声明为inline而且这个优化看起来很直接。
把函数指针作为参数会抑制内联的事实解释了一个长期使用C的程序员经常发现却难以相信的现象:在速度上,C++的sort实际上总是使C的qsort感到窘迫。当然,C++有函数、实例化的类模板和看起来很有趣的operator()函数需要调用,而C只是进行简单的函数调用,但所有的C++“开销”都在编译期被吸收。在运行期,sort内联调用它的比较函数(假设比较函数已经被声明为inline而且它的函数体在编译期可以得到)而qsort通过一个指针调用它的比较函数。结果是sort运行得更快。在我的测试的一百万个double的vector上,它快670%,但不要光相信我的话,亲自试试。很容易证实当比较函数对象和真的函数作为算法的参数时,那是一个纯红利。
-----------------------
似乎是说在"strcmp"永远不可能内联调用,真是郁闷阿!
难道在这个排序字符串的简单问题上C始终要输给C++? :mad:

一个解决办法是自己重新定义一个str_sort函数,比如
void str_sort(char** pStr, size_t size);
将比较的过程嵌入函数内部,但是这样就完全没把握一定比标准库的qsort快,库里面的玩艺可是千锤百炼过的噢~

难道没有一方面利用库函数,另一方面又保证内联的办法么? :ask
发表于 2005-11-5 18:00:02 | 显示全部楼层
你可以把 qsort 的源代码插入到源代码里,然后把对比较函数的调用换成实际的比较代码
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-5 19:07:57 | 显示全部楼层
不好意思阿,我用的是VC++,哪里能看到源代码?
回复 支持 反对

使用道具 举报

发表于 2005-11-5 19:28:27 | 显示全部楼层
安装 VC 的目录里就有。你找找看吧。
回复 支持 反对

使用道具 举报

 楼主| 发表于 2005-11-5 20:16:23 | 显示全部楼层
呵呵,找到啦,谢谢 :2cool
终于C又比C++快了
回复 支持 反对

使用道具 举报

发表于 2005-11-6 12:30:13 | 显示全部楼层
VC++能写C99???
VC++2005支持的标准只有:
ISO C95
ISO C++98
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 注册

本版积分规则

快速回复 返回顶部 返回列表