Java代碼轉C代碼經驗

 最近在做一些分詞模型,我在網絡上參加了一些開源討人論壇的討論並下載相關的源代碼,那些源代碼要不就是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個基本步驟,這樣,基本上不會出現什麼內存溢出的問題。
呵呵,,,如果有什麼不足的地方請版上的高手指點指點。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章