文字處理軟件應(yīng)該是軟件開發(fā)中的一大支柱,而任何軟件中字符串的處理更不可或缺。這里主要借鑒windows核心編程談?wù)勈褂肬NICODE的好處。
既然是基于windows編程,就得看看windows平臺本身對字符的處理方式。由于ANSI字符采用8位進行編碼,對于西歐ABC之類足夠,然而對于中東的字符不實用(考慮下我們中國的漢字),所以就出現(xiàn)了UNICODE。window98是基于ANSI的平臺,windows2000是基于UNICODE開發(fā)的平臺,因此可以知道在調(diào)用Windows API的時候,假如我們在98系統(tǒng)上傳遞UNICODE字符,那么系統(tǒng)在背后會先把字符轉(zhuǎn)化為ANSI字符然后調(diào)用API;相反,我們在2000系統(tǒng)上傳遞ANSI字符,那么會先轉(zhuǎn)化為UNICODE字符。
去年看過(準確說是翻了一下,沒時間看)一本書《C/C++-編程高手箴言》(梁肇新 超級解霸作者),他里面有一部分是談到使CPU降溫,很好奇翻了一下,主要講如何使CPU少轉(zhuǎn)幾圈。我的感想是,要想成為一名優(yōu)秀的軟件開發(fā)人員,必須make good use of (有時漢語無法表達這么好) CPU和RAM,盡量少浪費時鐘和內(nèi)存塊,當然也需要充分利用否則也是浪費,其中把握的是一個度,扯遠了,回來繼續(xù)談UNICODE。
先看看使用UNICODE的好處(書上的):
1、可以很容易地在不同語言之間進行數(shù)據(jù)交換。
2、使你能夠分配支持所有語言的單個二進制。exe文件或DLL文件。
3、提高應(yīng)用程序的運行效率。
如何基于UNICODE編譯:
只需定義宏_UNICODE或者UNICODE (VC 2005默認采用Unicode編譯)
Windows宏定義處理支持ANSI和UNICODE編譯
大學C、C++語言中我們學習字符表示是char,由于書中講解全部一個模式,而開發(fā)類書籍很少講解ANSI、UNICODE字符串區(qū)別,使得很少有人關(guān)注。在進行函數(shù)調(diào)用的時候,很少去關(guān)注接口處字符串處理,可能無意中你就使CPU多轉(zhuǎn)幾圈。
ANSI字符表示是char,占8位;UNICODE字符表示是wchar_t,占16位。Windows編程用宏對這兩種類型進行了封裝:
typedef?char?CHAR;
typedef?wchar_t?WCHAR;表示這兩種字符串數(shù)據(jù):
CHAR????chANSI[]????=?"hello";
WCHAR????chUnicode[]????=?L"hello";同樣表示字符串卻要使用兩種表示方法,Windows為我們定義了一套宏用來處理這些問題,例如用TCHAR宏表示字符,用_T()宏來表示字符常量類型,它根據(jù)編譯字符集選項來確定具體類型。同樣定義了字符處理函數(shù)宏,具體參看msdn。
下面基于提高應(yīng)用程序的運行效率來探討,純理論分析:
CHAR????chANSI[100];
WCHAR????chUnicode[100];
//?Normal?sprintf:?all?string?are?ANSI
sprintf(chANSI,?"%s",?"ANSI?Str");
//?Converts?Unicode?string?to?ANSI?(Be?careful?%s?and?%S)
sprintf(chANSI,?"%S",?L"Unicode?Str");
//?Normal?swprintf:?all?string?are?Unicode
swprintf(chUnicode,?L"%s",?L"Unicode?Str");
//?Converts?ANSI??string?to?Unicode?(Be?careful?%s?and?%S)
swprintf(chUnicode,?L"%S",?"ANSI?Str");從上面可以看出,簡單的一個打印函數(shù)都可能導(dǎo)致CPU多花時鐘來進行函數(shù)調(diào)用前處理,所以編程時一定要養(yǎng)成好習慣,隨手做到可能使你的代碼與眾不同。由于我們目前的系統(tǒng)大多是Windows 2000以上版本,采用Uincode字符集,在API調(diào)用的時候接口字符都是Unicode的,所以最好采用Unicode字符風格進行編碼,這樣可以減少調(diào)用時轉(zhuǎn)換開銷。
應(yīng)該注意的問題:
假設(shè)定義一個字符數(shù)組TCHAR szName[100],當基于Unicode編譯的時候,它實際占用200字節(jié),假設(shè)有一個給字符賦值函數(shù):
void?SetName(TCHAR*?pName,?int?iSize)調(diào)用該函數(shù):
SetName(szName,?sizeof(szName))這樣就可能產(chǎn)生錯誤,sizeof求出的是數(shù)組所占字節(jié)數(shù)目,而不是字符個數(shù),字符個數(shù)應(yīng)該是sizeof(szName)/sizeof(TCHAR)。所以編程的時候腦袋一定要繃緊一根弦,提防類似錯誤。
好了,按照梁大師的理論CPU應(yīng)該是降溫了,按照能量守恒定律CPU熱量由電產(chǎn)生,那我們應(yīng)該是節(jié)約用電了呀!真想不到編程風格可以直接為國家節(jié)約用電,何樂而不為。開玩笑,不過我這樣喜歡電腦的人確實希望電腦可以輕松一點,尤其我大學那個電腦,一轉(zhuǎn)起來咔嚓響,仿佛象老人一樣不堪重負,真為它擔心。
posted on 2006-09-11 20:34
萬連文 閱讀(2334)
評論(12) 編輯 收藏 引用 所屬分類:
亂七八糟