最近在做一些分词模型,我在网络上参加了一些开源讨人论坛的讨论并下载相关的源代码,那些源代码要不就是JAVA就C#,速度感觉不是很快!在基本理解的情况下,我打算将其代码转化为C代码,以提高其速度。
里面一些要进行字符处理,感觉JAVA太上层,有点不好掌控。C语言自由度大,易于操作和处理。
我首先针对JAVA中的BEAN包进行了C语言改写,在进行改写的时候,感觉C虽然速度快,但是处理很烦琐,比如像Java中一个类ArrayList,如果里面装不同的对象的话,我就得为其重新写一些重复的代码,比如ArrayList<SegNode>实例和ArrayList<int>实例,这两个实例本来在C++用一个STL就能搞定,但是到了C语言下,就无能为力了。
为此我在GOOGLE上,搜索了相关的C语言的模板文章,并在一个负责编写gLib的网站了,找到相应的实现方法,就是用一些宏进行处理,
比如:
#define ArrayList(name, type, iLen, blFlag) //name为变量名,type为变量的类型,iLen表示申请的空间大小 /
{/
.../
}
这种方法在一定的程序上可以实现模板的功能但是,由于宏不能进行类型检查,所以必须使用者十分熟悉这些原理和代码才能进行很好的调用,使用这个方法还有一个不好的地方就是,由于宏是替代的,如果用多了话,就会出现代码膨胀,另外用宏来编写代码,很不容易进行调试。
如果要解决安全调用这些类似模板的宏,你可以在这之上编写相关的函数,比如
针对ArrayList(name,type,iLen)宏, 可以根据不同的类型编写相应的函数
Bool SegNode_ArrayList_Construstor(SegNode *ptSn, int iLen) //
{
Bool blFlag = false;
ArrayList(*ptSn, SegNode, iLen, blFlag); //invoke the macro
return blFlag;
}
...//
但是又好像失去了模板的功用,但是由于在定义不能的类型的相关的构造函数和析构函数的时候,都调用同一个
宏,相对来说,作者的编码工作量是减少了。但是对于使用者来说又多了许多没有必要的函数名字。
看来在代码的易用和重用这两个方面是此消彼长的关系。
还有在针对对象进行C语言改写时,应该遵循以下几个方面的原则:
1、C语言函数输出变量尽量放到输出参数中,返回值应返回函数错误类型
2、针对某个对象进行编程时,应该将对象名字作为其前缀+_函数名字
3、函数模块应遵循:
{
int i; //1. var declarations
...
assert(..); //2. assertions.
if (..) //3. check params
{... }
i = 0; //4. initializing....
Obj_Constructor(); // 5. constructors
.... //6.body of func.
Obj_Destructor(); //7.destructors
return (...) //8.returns
}
8个基本步骤,这样,基本上不会出现什么内存溢出的问题。
呵呵,,,如果有什么不足的地方请版上的高手指点指点。