• <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            萬(wàn)星星@豌豆莢 歡迎加入我們
            一個(gè)吃軟飯的男人!!!!!我只想寫程序####
            微博:http://weibo.com/wanlianwen
            posts - 172,  comments - 1253,  trackbacks - 0
            文字處理軟件應(yīng)該是軟件開(kāi)發(fā)中的一大支柱,而任何軟件中字符串的處理更不可或缺。這里主要借鑒windows核心編程談?wù)勈褂肬NICODE的好處。

            既然是基于windows編程,就得看看windows平臺(tái)本身對(duì)字符的處理方式。由于ANSI字符采用8位進(jìn)行編碼,對(duì)于西歐ABC之類足夠,然而對(duì)于中東的字符不實(shí)用(考慮下我們中國(guó)的漢字),所以就出現(xiàn)了UNICODE。window98是基于ANSI的平臺(tái),windows2000是基于UNICODE開(kāi)發(fā)的平臺(tái),因此可以知道在調(diào)用Windows API的時(shí)候,假如我們?cè)?8系統(tǒng)上傳遞UNICODE字符,那么系統(tǒng)在背后會(huì)先把字符轉(zhuǎn)化為ANSI字符然后調(diào)用API;相反,我們?cè)?000系統(tǒng)上傳遞ANSI字符,那么會(huì)先轉(zhuǎn)化為UNICODE字符。

            去年看過(guò)(準(zhǔn)確說(shuō)是翻了一下,沒(méi)時(shí)間看)一本書《C/C++-編程高手箴言》(梁肇新 超級(jí)解霸作者),他里面有一部分是談到使CPU降溫,很好奇翻了一下,主要講如何使CPU少轉(zhuǎn)幾圈。我的感想是,要想成為一名優(yōu)秀的軟件開(kāi)發(fā)人員,必須make good use of (有時(shí)漢語(yǔ)無(wú)法表達(dá)這么好) CPU和RAM,盡量少浪費(fèi)時(shí)鐘和內(nèi)存塊,當(dāng)然也需要充分利用否則也是浪費(fèi),其中把握的是一個(gè)度,扯遠(yuǎn)了,回來(lái)繼續(xù)談UNICODE。

            先看看使用UNICODE的好處(書上的):
            1、可以很容易地在不同語(yǔ)言之間進(jìn)行數(shù)據(jù)交換。
            2、使你能夠分配支持所有語(yǔ)言的單個(gè)二進(jìn)制。exe文件或DLL文件。
            3、提高應(yīng)用程序的運(yùn)行效率。

            如何基于UNICODE編譯:
            只需定義宏_UNICODE或者UNICODE (VC 2005默認(rèn)采用Unicode編譯)

            Windows宏定義處理支持ANSI和UNICODE編譯
            大學(xué)C、C++語(yǔ)言中我們學(xué)習(xí)字符表示是char,由于書中講解全部一個(gè)模式,而開(kāi)發(fā)類書籍很少講解ANSI、UNICODE字符串區(qū)別,使得很少有人關(guān)注。在進(jìn)行函數(shù)調(diào)用的時(shí)候,很少去關(guān)注接口處字符串處理,可能無(wú)意中你就使CPU多轉(zhuǎn)幾圈。
            ANSI字符表示是char,占8位;UNICODE字符表示是wchar_t,占16位。Windows編程用宏對(duì)這兩種類型進(jìn)行了封裝:
            typedef?char?CHAR;
            typedef?wchar_t?WCHAR;
            表示這兩種字符串?dāng)?shù)據(jù):
            CHAR????chANSI[]????=?"hello";
            WCHAR????chUnicode[]????
            =?L"hello";
            同樣表示字符串卻要使用兩種表示方法,Windows為我們定義了一套宏用來(lái)處理這些問(wèn)題,例如用TCHAR宏表示字符,用_T()宏來(lái)表示字符常量類型,它根據(jù)編譯字符集選項(xiàng)來(lái)確定具體類型。同樣定義了字符處理函數(shù)宏,具體參看msdn。

            下面基于提高應(yīng)用程序的運(yùn)行效率來(lái)探討,純理論分析:
            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");
            從上面可以看出,簡(jiǎn)單的一個(gè)打印函數(shù)都可能導(dǎo)致CPU多花時(shí)鐘來(lái)進(jìn)行函數(shù)調(diào)用前處理,所以編程時(shí)一定要養(yǎng)成好習(xí)慣,隨手做到可能使你的代碼與眾不同。由于我們目前的系統(tǒng)大多是Windows 2000以上版本,采用Uincode字符集,在API調(diào)用的時(shí)候接口字符都是Unicode的,所以最好采用Unicode字符風(fēng)格進(jìn)行編碼,這樣可以減少調(diào)用時(shí)轉(zhuǎn)換開(kāi)銷。

            應(yīng)該注意的問(wèn)題:
            假設(shè)定義一個(gè)字符數(shù)組TCHAR szName[100],當(dāng)基于Unicode編譯的時(shí)候,它實(shí)際占用200字節(jié),假設(shè)有一個(gè)給字符賦值函數(shù):
            void?SetName(TCHAR*?pName,?int?iSize)
            調(diào)用該函數(shù):
            SetName(szName,?sizeof(szName))
            這樣就可能產(chǎn)生錯(cuò)誤,sizeof求出的是數(shù)組所占字節(jié)數(shù)目,而不是字符個(gè)數(shù),字符個(gè)數(shù)應(yīng)該是sizeof(szName)/sizeof(TCHAR)。所以編程的時(shí)候腦袋一定要繃緊一根弦,提防類似錯(cuò)誤。

            好了,按照梁大師的理論CPU應(yīng)該是降溫了,按照能量守恒定律CPU熱量由電產(chǎn)生,那我們應(yīng)該是節(jié)約用電了呀!真想不到編程風(fēng)格可以直接為國(guó)家節(jié)約用電,何樂(lè)而不為。開(kāi)玩笑,不過(guò)我這樣喜歡電腦的人確實(shí)希望電腦可以輕松一點(diǎn),尤其我大學(xué)那個(gè)電腦,一轉(zhuǎn)起來(lái)咔嚓響,仿佛象老人一樣不堪重負(fù),真為它擔(dān)心。
            posted on 2006-09-11 20:34 萬(wàn)連文 閱讀(2335) 評(píng)論(12)  編輯 收藏 引用 所屬分類: 亂七八糟

            FeedBack:
            # re: 使用UNICODE提高效率
            2006-09-11 20:54 | chenger
            梁肇新那本書……
            關(guān)于他寫的Windows編程的東西,我不是太了解,不好評(píng)論。
            只是覺(jué)得看他的文字很令人不爽。  回復(fù)  更多評(píng)論
              
            # re: 使用UNICODE提高效率
            2006-09-11 22:14 | 笨笨
            使用UNICODE提高效率不是絕對(duì)的;從我的理解,CPU讀100個(gè)字節(jié)肯定要比讀200個(gè)字節(jié)少用時(shí)間,如果轉(zhuǎn)換的時(shí)間比100個(gè)字節(jié)讀取的時(shí)間短,那么為什么使用UNICODE可以讓CPU少轉(zhuǎn)?
            所以使用UNICODE提高效率純粹是抄做,沒(méi)有數(shù)據(jù)的依據(jù)的抄做。
              回復(fù)  更多評(píng)論
              
            # re: 使用UNICODE提高效率
            2006-09-11 22:40 | 萬(wàn)連文
            為了軟件國(guó)際化,軟件開(kāi)發(fā)最好采用Unicode,以這個(gè)作為前提,我們調(diào)用API時(shí)候,采用ANSI字符到接口地方必須會(huì)經(jīng)過(guò)一個(gè)轉(zhuǎn)化過(guò)程,這個(gè)就是額外花費(fèi)。至于你談到得那個(gè)時(shí)間我沒(méi)有考證,可能一時(shí)半會(huì)無(wú)法考證,不過(guò)按照常理,你也沒(méi)有給出依據(jù),既然選擇微軟,還是跟著它走好了。另:采用Unicode字符可以避免混合字符集使用帶來(lái)一些隱晦的混淆。用Spy++隨便看一個(gè)MicroSoft開(kāi)發(fā)的Windows窗口,好想都是Unicode的。  回復(fù)  更多評(píng)論
              
            # re: 使用UNICODE提高效率
            2006-09-12 02:59 | shaker
            適用UNICODE不是在乎它會(huì)不會(huì)帶來(lái)效率優(yōu)勢(shì) 而是更加的適合國(guó)際化 區(qū)別不同的字符集

            梁大師那本書 怎么看完全是個(gè)人觀點(diǎn) 個(gè)人覺(jué)得還是有可取的地方的  回復(fù)  更多評(píng)論
              
            # re: 使用UNICODE提高效率
            2006-09-12 08:28 | 開(kāi)個(gè)玩笑
            按這個(gè)說(shuō)法,是不是你不提交字符串,CPU就不轉(zhuǎn)了啊,如果這樣的話,那就一定省了能源了,呵呵  回復(fù)  更多評(píng)論
              
            # re: 使用UNICODE提高效率
            2006-09-12 08:44 | 笨笨
            上面說(shuō)的就對(duì)了,UNICODE不是效率優(yōu)勢(shì),在于國(guó)際化,實(shí)際上效率也沒(méi)有優(yōu)勢(shì)。
            考證上面的時(shí)間其實(shí)也比較簡(jiǎn)單。所以不要誤導(dǎo)我們這樣的讀者。  回復(fù)  更多評(píng)論
              
            # re: 使用UNICODE提高效率
            2006-09-12 09:00 | 夢(mèng)在天涯
            windows 2000 的即支持ANSI也支持unicode的開(kāi)發(fā),所以隨便你用那種字符集編程都可以很好的運(yùn)行.但是Windows 2000 是使用U n i c o d e 從頭進(jìn)行開(kāi)發(fā)的,用于創(chuàng)建窗口、顯示文本、進(jìn)行字符串操作等的所有核心函數(shù)都需要U n i c o d e 字符串。如果調(diào)用任何一個(gè)Wi n d o w s 函數(shù)并給它傳遞一個(gè)A N S I 字符串,那么系統(tǒng)首先要將字符串轉(zhuǎn)換成U n i c o d e ,然后將U n i c o d e 字符串傳遞給操作系統(tǒng)。如果希望函數(shù)返回A N S I 字符串,系統(tǒng)就會(huì)首先將U n i c o d e 字符串轉(zhuǎn)換成A N S I 字符串,然后將結(jié)果返回給你的應(yīng)用程序。所有這些轉(zhuǎn)換操作都是在你看不見(jiàn)的情況下發(fā)生的。當(dāng)然,進(jìn)行這些字符串的轉(zhuǎn)換需要占用系統(tǒng)的時(shí)間和內(nèi)存。

            例如,如果調(diào)用C r e a t e Wi n d o w E x 函數(shù),并傳遞類名字和窗口標(biāo)題文本的非U n i c o d e 字符串,那么C r e a t e Wi n d o w E x 必須分配內(nèi)存塊(在你的進(jìn)程的默認(rèn)堆中),將非U n i c o d e 字符串轉(zhuǎn)換成U n i c o d e 字符串,并將結(jié)果存儲(chǔ)在分配到的內(nèi)存塊中,然后調(diào)用U n i c o d e 版本的C r e a t e Wi n d o w E x函數(shù)。

            對(duì)于用字符串填入緩存的函數(shù)來(lái)說(shuō),系統(tǒng)必須首先將U n i c o d e 字符串轉(zhuǎn)換成非U n i c o d e 字符串,然后你的應(yīng)用程序才能處理該字符串。由于系統(tǒng)必須執(zhí)行所有這些轉(zhuǎn)換操作,因此你的應(yīng)用程序需要更多的內(nèi)存,并且運(yùn)行的速度比較慢。通過(guò)從頭開(kāi)始用U n i c o d e 來(lái)開(kāi)發(fā)應(yīng)用程序,就能夠使你的應(yīng)用程序更加有效地運(yùn)行。

            windows xp 也是的,但是98,ce等版本不是,<<windows核心編程>>中有說(shuō),也可以看我的blog中"windows核心編程--字符集"一文.

              回復(fù)  更多評(píng)論
              
            # re: 使用UNICODE提高效率
            2006-09-12 09:05 | 夢(mèng)在天涯
            另外,使unicode是軟件可以更快更高效的在各國(guó)間轉(zhuǎn)化,也就是國(guó)際化,而改動(dòng)很少或幾乎不用修改代碼  回復(fù)  更多評(píng)論
              
            # re: 使用UNICODE提高效率
            2006-09-12 09:08 | 萬(wàn)連文
            如果說(shuō)誤導(dǎo)應(yīng)該不至于,使用Unicode也是微軟建議的。出了例子是Windows核心編程里面的,我本人覺(jué)得算是合理。至于別人是否贊同和采用,個(gè)人愛(ài)好問(wèn)題。  回復(fù)  更多評(píng)論
              
            # re: 使用UNICODE提高效率
            2006-09-12 09:10 | LOGOS
            看你的東東越來(lái)越辛苦了。我必須看一遍,關(guān)掉頁(yè)面,再打開(kāi),寫評(píng)論,不然memory就被吃光了。
            unicode的本質(zhì)意義是簡(jiǎn)便的國(guó)際化,但是并不是說(shuō)可以很隨意的使用unicode了,因?yàn)檐浖3R蕾囉趧e的庫(kù),并不是每一個(gè)庫(kù)都有unicode實(shí)現(xiàn)的。
            個(gè)人覺(jué)得,unicode的那點(diǎn)加速無(wú)關(guān)緊要。如果你的軟件慢了,還是從別的地方進(jìn)行優(yōu)化的好。  回復(fù)  更多評(píng)論
              
            # re: 使用UNICODE提高效率
            2006-09-12 09:41 | 笨笨
            LZ還沒(méi)有明白所說(shuō),提倡UNICODE沒(méi)有任何問(wèn)題,該提倡,但不能以效率來(lái)說(shuō)明問(wèn)題。  回復(fù)  更多評(píng)論
              
            # re: 使用UNICODE提高效率
            2006-09-12 09:43 | 笨笨
            One word, just 跑題了!呵呵  回復(fù)  更多評(píng)論
              
            簡(jiǎn)歷下載
            聯(lián)系我

            <2007年5月>
            293012345
            6789101112
            13141516171819
            20212223242526
            272829303112
            3456789

            常用鏈接

            留言簿(66)

            隨筆分類

            隨筆檔案

            相冊(cè)

            搜索

            •  

            最新評(píng)論

            閱讀排行榜

            評(píng)論排行榜

            精品熟女少妇AV免费久久| 精品无码久久久久久尤物| 免费一级欧美大片久久网 | 久久精品99久久香蕉国产色戒 | 精品久久久无码人妻中文字幕豆芽| 成人久久久观看免费毛片| 久久午夜无码鲁丝片午夜精品| 久久精品国产色蜜蜜麻豆| 91久久香蕉国产熟女线看| 久久亚洲sm情趣捆绑调教| 久久久91精品国产一区二区三区| 久久久久成人精品无码| 国产成人久久精品激情| 色狠狠久久综合网| 精品久久人人妻人人做精品| 亚洲国产精品高清久久久| 久久伊人精品青青草原日本| 欧美一区二区精品久久| 日产精品久久久一区二区| 久久影视国产亚洲| 999久久久免费国产精品播放| 性做久久久久久久| 亚洲日韩欧美一区久久久久我| 国产精品午夜久久| 91久久九九无码成人网站| 97超级碰碰碰久久久久| 人妻精品久久无码区| 一本色道久久99一综合| 一本色综合久久| 一本久久免费视频| 亚洲午夜精品久久久久久浪潮| 久久青青国产| 久久se精品一区二区影院 | 久久人做人爽一区二区三区| 欧美午夜A∨大片久久| 久久青青草原亚洲av无码| 久久AⅤ人妻少妇嫩草影院| 精品久久久久国产免费| 国内精品久久久久久久久| 久久国产香蕉视频| 亚洲欧洲久久av|