日韩床上生活一级视频|能看毛片的操逼网站|色悠悠网站在线观看视频|国产免费观看A淫色免费|国产av久久久久久久|免费A级视频美女网站黄|国产毛片av日韩小黄片|热久久免费国产视频|中文字幕无码色色|成人在线视频99久久久

機(jī)電之家資源網(wǎng)
單片機(jī)首頁|單片機(jī)基礎(chǔ)|單片機(jī)應(yīng)用|單片機(jī)開發(fā)|單片機(jī)文案|軟件資料下載|音響制作|電路圖下載 |嵌入式開發(fā)
培訓(xùn)信息
贊助商
編程修養(yǎng)
編程修養(yǎng)
 更新時間:2008-8-17 16:42:55  點(diǎn)擊數(shù):30
【字體: 字體顏色

我保證,做過許多C/C++的工程的程序員,都會對malloc或是new有些感冒。當(dāng)你什么時候在使用malloc和new時,有一種輕度的緊張和惶恐的感覺時,你就具備了這方面的修養(yǎng)了。
  
對于malloc和free的操作有以下規(guī)則:
1) 配對使用,有一個malloc,就應(yīng)該有一個free。(C++中對應(yīng)為new和delete)
2) 盡量在同一層上使用,不要像上面那種,malloc在函數(shù)中,而free在函數(shù)外。最好在同一調(diào)用層上使用這兩個函數(shù)。
3) malloc分配的內(nèi)存一定要初始化。free后的指針一定要設(shè)置為NULL。  
注:雖然現(xiàn)在的操作系統(tǒng)(如:UNIX和Win2k/NT)都有進(jìn)程內(nèi)存跟蹤機(jī)制,也就是如果你有沒有釋放的內(nèi)存,操作系統(tǒng)會幫你釋放。但操作系統(tǒng)依然不會釋放你程序中所有產(chǎn)生了Memory Leak的內(nèi)存,所以,最好還是你自己來做這個工作。(有的時候不知不覺就出現(xiàn)Memory Leak了,而且在幾百萬行的代碼中找無異于海底撈針,Rational有一個工具叫Purify,可能很好的幫你檢查程序中的Memory Leak)

9、變量的初始化
--------
接上一條,變量一定要被初始化再使用。C/C++編譯器在這個方面不會像JAVA一樣幫你初始化,這一切都需要你自己來,如果你使用了沒有初始化的變量,結(jié)果未知。好的程序員從來都會在使用變量前初始化變量的。如:
  1) 對malloc分配的內(nèi)存進(jìn)行memset清零操作。(可以使用calloc分配一塊全零的內(nèi)存)
  2) 對一些棧上分配的struct或數(shù)組進(jìn)行初始化。(最好也是清零)
不過話又說回來了,初始化也會造成系統(tǒng)運(yùn)行時間有一定的開銷,所以,也不要對所有的變量做初始化,這個也沒有意義。好的程序員知道哪些變量需要初始化,哪些則不需要。如:以下這種情況,則不需要。
    
    char *pstr; /* 一個字符串 */
    pstr = ( char* ) malloc( 50 );
    if ( pstr == NULL ) exit(0);
    strcpy( pstr, "Hello Wrold" );

但如果是下面一種情況,最好進(jìn)行內(nèi)存初始化。(指針是一個危險的東西,一定要初始化)
    char **pstr; /* 一個字符串?dāng)?shù)組 */
    pstr = ( char** ) malloc( 50 );
    if ( pstr == NULL ) exit(0);
    
    /* 讓數(shù)組中的指針都指向NULL */
    memset( pstr, 0, 50*sizeof(char*) );
    
而對于全局變量,和靜態(tài)變量,一定要聲明時就初始化。因?yàn)槟悴恢浪谝淮螘谀睦锉皇褂谩K允褂们俺跏歼@些變量是比較不現(xiàn)實(shí)的,一定要在聲明時就初始化它們。如:
  Links *plnk = NULL; /* 對于全局變量plnk初始化為NULL */

10、h和c文件的使用
---------
H文件和C文件怎么用呢?一般來說,H文件中是declare(聲明),C文件中是define(定義)。因?yàn)镃文件要編譯成庫文件(Windows下是.obj/.lib,UNIX下是.o/.a),如果別人要使用你的函數(shù),那么就要引用你的H文件,所以,H文件中一般是變量、宏定義、枚舉、結(jié)構(gòu)和函數(shù)接口的聲明,就像一個接口說明文件一樣。而C文件則是實(shí)現(xiàn)細(xì)節(jié)。
H文件和C文件最大的用處就是聲明和實(shí)現(xiàn)分開。這個特性應(yīng)該是公認(rèn)的了,但我仍然看到有些人喜歡把函數(shù)寫在H文件中,這種習(xí)慣很不好。(如果是C++話,對于其模板函數(shù),在VC中只有把實(shí)現(xiàn)和聲明都寫在一個文件中,因?yàn)閂C不支持export關(guān)鍵字)。而且,如果在H文件中寫上函數(shù)的實(shí)現(xiàn),你還得在 makefile中把頭文件的依賴關(guān)系也加上去,這個就會讓你的makefile很不規(guī)范。
最后,有一個最需要注意的地方就是:帶初始化的全局變量不要放在H文件中!
例如有一個處理錯誤信息的結(jié)構(gòu):
  char* errmsg[] = {
    /* 0 */    "No error",        
    /* 1 */    "Open file error",    
    /* 2 */    "Failed in sending/receiving a message", 
    /* 3 */    "Bad arguments", 
    /* 4 */    "Memeroy is not enough",
    /* 5 */    "Service is down; try later",
    /* 6 */    "Unknow information",
    /* 7 */    "A socket operation has failed",
    /* 8 */    "Permission denied",
    /* 9 */    "Bad configuration file format", 
    /* 10 */   "Communication time out",
    ......
    ......
  };
  
請不要把這個東西放在頭文件中,因?yàn)槿绻愕倪@個頭文件被5個函數(shù)庫(.lib或是.a)所用到,于是他就被鏈接在這5個.lib或.a中,而如果你的一個程序用到了這5個函數(shù)庫中的函數(shù),并且這些函數(shù)都用到了這個出錯信息數(shù)組。那么這份信息將有5個副本存在于你的執(zhí)行文件中。如果你的這個errmsg很大的話,而且你用到的函數(shù)庫更多的話,你的執(zhí)行文件也會變得很大。
正確的寫法應(yīng)該把它寫到C文件中,然后在各個需要用到errmsg的C文件頭上加上 extern char* errmsg[]; 的外部聲明,讓編譯器在鏈接時才去管他,這樣一來,就只會有一個errmsg存在于執(zhí)行文件中,而且,這樣做很利于封裝。
我曾遇到過的最瘋狂的事,就是在我的目標(biāo)文件中,這個errmsg一共有112個副本,執(zhí)行文件有8M左右。當(dāng)我把errmsg放到C文件中,并為一千多個C文件加上了extern的聲明后,所有的函數(shù)庫文件尺寸都下降了20%左右,而我的執(zhí)行文件只有5M了。一下子少了3M啊。

〔 備注 〕
-----
有朋友對我說,這個只是一個特例,因?yàn)?如果errmsg在執(zhí)行文件中存在多個副本時,可以加快程序運(yùn)行速度,理由是errmsg的多個復(fù)本會讓系統(tǒng)的內(nèi)存換頁降低,達(dá)到效率提升。像我們這里所說的errmsg只有一份,當(dāng)某函數(shù)要用errmsg時,如果內(nèi)存隔得比較遠(yuǎn),會產(chǎn)生換頁,反而效率不高。

  • 上一篇: 實(shí)時多任務(wù)操作系統(tǒng)(RTOS)進(jìn)入單片機(jī)開發(fā)領(lǐng)域
  • 下一篇: 學(xué)習(xí)AVR(六)CPU中狀態(tài)寄存器
  • 發(fā)表評論   告訴好友   打印此文  收藏此頁  關(guān)閉窗口  返回頂部
    熱點(diǎn)文章
     
    推薦文章
     
    相關(guān)文章
    網(wǎng)友評論:(只顯示最新5條。)
    關(guān)于我們 | 聯(lián)系我們 | 廣告合作 | 付款方式 | 使用幫助 | 機(jī)電之家 | 會員助手 | 免費(fèi)鏈接

    點(diǎn)擊這里給我發(fā)消息66821730(技術(shù)支持)點(diǎn)擊這里給我發(fā)消息66821730(廣告投放) 點(diǎn)擊這里給我發(fā)消息41031197(編輯) 點(diǎn)擊這里給我發(fā)消息58733127(審核)
    本站提供的機(jī)電設(shè)備,機(jī)電供求等信息由機(jī)電企業(yè)自行提供,該企業(yè)負(fù)責(zé)信息內(nèi)容的真實(shí)性、準(zhǔn)確性和合法性。
    機(jī)電之家對此不承擔(dān)任何保證責(zé)任,有侵犯您利益的地方請聯(lián)系機(jī)電之家,機(jī)電之家將及時作出處理。
    Copyright 2007 機(jī)電之家 Inc All Rights Reserved.機(jī)電之家-由機(jī)電一體化網(wǎng)更名-聲明
    電話:0571-87774297 傳真:0571-87774298
    杭州濱興科技有限公司提供技術(shù)支持

    主辦:杭州市高新區(qū)(濱江)機(jī)電一體化學(xué)會
    中國行業(yè)電子商務(wù)100強(qiáng)網(wǎng)站

    網(wǎng)站經(jīng)營許可證:浙B2-20080178-1