• <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>
            萬星星@豌豆莢 歡迎加入我們
            一個吃軟飯的男人!!!!!我只想寫程序####
            微博:http://weibo.com/wanlianwen
            posts - 172,  comments - 1253,  trackbacks - 0
            文字處理軟件應該是軟件開發中的一大支柱,而任何軟件中字符串的處理更不可或缺。這里主要借鑒windows核心編程談談使用UNICODE的好處。

            既然是基于windows編程,就得看看windows平臺本身對字符的處理方式。由于ANSI字符采用8位進行編碼,對于西歐ABC之類足夠,然而對于中東的字符不實用(考慮下我們中國的漢字),所以就出現了UNICODE。window98是基于ANSI的平臺,windows2000是基于UNICODE開發的平臺,因此可以知道在調用Windows API的時候,假如我們在98系統上傳遞UNICODE字符,那么系統在背后會先把字符轉化為ANSI字符然后調用API;相反,我們在2000系統上傳遞ANSI字符,那么會先轉化為UNICODE字符。

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

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

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

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

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

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

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

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

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

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

            對于用字符串填入緩存的函數來說,系統必須首先將U n i c o d e 字符串轉換成非U n i c o d e 字符串,然后你的應用程序才能處理該字符串。由于系統必須執行所有這些轉換操作,因此你的應用程序需要更多的內存,并且運行的速度比較慢。通過從頭開始用U n i c o d e 來開發應用程序,就能夠使你的應用程序更加有效地運行。

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

              回復  更多評論
              
            # re: 使用UNICODE提高效率
            2006-09-12 09:05 | 夢在天涯
            另外,使unicode是軟件可以更快更高效的在各國間轉化,也就是國際化,而改動很少或幾乎不用修改代碼  回復  更多評論
              
            # re: 使用UNICODE提高效率
            2006-09-12 09:08 | 萬連文
            如果說誤導應該不至于,使用Unicode也是微軟建議的。出了例子是Windows核心編程里面的,我本人覺得算是合理。至于別人是否贊同和采用,個人愛好問題。  回復  更多評論
              
            # re: 使用UNICODE提高效率
            2006-09-12 09:10 | LOGOS
            看你的東東越來越辛苦了。我必須看一遍,關掉頁面,再打開,寫評論,不然memory就被吃光了。
            unicode的本質意義是簡便的國際化,但是并不是說可以很隨意的使用unicode了,因為軟件常常依賴于別的庫,并不是每一個庫都有unicode實現的。
            個人覺得,unicode的那點加速無關緊要。如果你的軟件慢了,還是從別的地方進行優化的好。  回復  更多評論
              
            # re: 使用UNICODE提高效率
            2006-09-12 09:41 | 笨笨
            LZ還沒有明白所說,提倡UNICODE沒有任何問題,該提倡,但不能以效率來說明問題。  回復  更多評論
              
            # re: 使用UNICODE提高效率
            2006-09-12 09:43 | 笨笨
            One word, just 跑題了!呵呵  回復  更多評論
              
            簡歷下載
            聯系我

            <2025年5月>
            27282930123
            45678910
            11121314151617
            18192021222324
            25262728293031
            1234567

            常用鏈接

            留言簿(66)

            隨筆分類

            隨筆檔案

            相冊

            搜索

            •  

            最新評論

            閱讀排行榜

            評論排行榜

            99久久精品免费观看国产| 亚洲AV无一区二区三区久久| AV无码久久久久不卡蜜桃 | 97久久婷婷五月综合色d啪蜜芽| 亚洲嫩草影院久久精品| 99精品国产在热久久无毒不卡| 亚洲欧美成人综合久久久| 久久久久久久精品妇女99| 国产精品久久久久久五月尺| 伊人色综合久久天天人守人婷| 国内精品久久久久久久亚洲| 韩国三级中文字幕hd久久精品| 国产农村妇女毛片精品久久| 久久久黄片| 久久人人添人人爽添人人片牛牛| 伊人久久大香线蕉综合Av| 久久综合国产乱子伦精品免费| 久久国产精品99精品国产| 2022年国产精品久久久久| 久久九九亚洲精品| 日本国产精品久久| 国产精品美女久久福利网站| 中文无码久久精品| 青青国产成人久久91网| 亚洲国产综合久久天堂| 久久久久久久97| 久久高潮一级毛片免费| 亚洲中文久久精品无码ww16| 99久久久国产精品免费无卡顿| 久久久WWW成人免费精品| 久久久久久久久66精品片| 狼狼综合久久久久综合网| 很黄很污的网站久久mimi色| 久久人人爽人人爽人人av东京热| 久久人人爽人人爽人人片AV不| 精品久久久久久国产免费了| 少妇久久久久久被弄高潮| 国产伊人久久| 国产精品视频久久久| 久久久久se色偷偷亚洲精品av| 久久久久免费精品国产|