宏定义和内联函数的学习
宏定義可以提高效率,但是宏不是函數(shù)。 預(yù)編譯通過代碼復(fù)制的方式代替函數(shù)調(diào)用,省去了諸如函數(shù)壓棧等系統(tǒng)過程,從而提高了效率。但是由于宏定義僅僅是代碼替換,所以引起很多問題。
#define? MAX(a,b) ?(a) > (b) ? ( a) : (b)
result=MAX(A,B)?+2 ?編譯器對其解釋為 (a) > (b) ? (a) : (b)+2 .導(dǎo)致該語句執(zhí)行與預(yù)期不符。
宏定義的另一個缺點就是無法訪問類的私有成員。
而內(nèi)聯(lián)函數(shù)通過把代碼直接復(fù)制進(jìn)調(diào)用函數(shù)體內(nèi),避免產(chǎn)生某些系統(tǒng)過程,同樣提高了效率,但是 內(nèi)聯(lián)函數(shù)可以進(jìn)行類型檢查,this指針同樣能應(yīng)用,這是宏定義無法比擬的。
內(nèi)聯(lián)函數(shù)必須是函數(shù)的聲明和定義一體,且在函數(shù)前面加inline。
內(nèi)存的三種分配方式:靜態(tài)存儲區(qū)分配,棧上分配,堆上分配。
內(nèi)存使用常見錯誤:
(1)內(nèi)存分配不成功,卻使用它。對策:使用前檢查內(nèi)存是否為NULL。
(2)內(nèi)存分配成功,但沒有初始化就使用它。對策:內(nèi)存分配后初始化。
(3)內(nèi)存分配成功且已經(jīng)初始化,但是越界。對策:做越界檢查。
(4)忘記釋放內(nèi)存,造成內(nèi)存泄漏。對策:內(nèi)存動態(tài)分配和釋放必須成雙配對。
(5)釋放了內(nèi)存卻繼續(xù)使用它。
(a)對象關(guān)系過于復(fù)雜,理不清楚究竟釋放了沒有。
(b)return指向棧內(nèi)存的指針或引用。
(c)free或delete內(nèi)存后,沒有把指針置為NULL。導(dǎo)致野指針。
指針與數(shù)組。數(shù)組名對應(yīng)著(而不是指向)一塊內(nèi)存,在生存期內(nèi),其地址不可改變,只能是數(shù)組內(nèi)容改變。
sizeof():
sizeof(數(shù)組)= 數(shù)組元素個數(shù)*sizeof(數(shù)組的元素數(shù)據(jù)類型)。
sizeof(指針)= 4;
數(shù)組作為參數(shù)傳遞時,數(shù)組名自動退化為指針類型,即sizeof(數(shù)組)=4;
sizeof(結(jié)構(gòu)體或者類):這個有點麻煩,和編譯器的設(shè)置有關(guān)系,pragma pack(n)是編譯器指定的內(nèi)存字節(jié)對齊方式,sizeof(結(jié)構(gòu)或者類)和pragma pack(n)關(guān)系密切,默認(rèn)的n=8,結(jié)構(gòu)中的成員占用的內(nèi)存起始地址為成員的數(shù)據(jù)類型的大小和n相比較的較小值。
指針參數(shù):
不要讓指針參數(shù)在函數(shù)體內(nèi)部申請內(nèi)存,如果非要指針在函數(shù)體內(nèi)部申請內(nèi)存,就要用指針的指針。函數(shù)的返回值不能使用棧內(nèi)分配的變量地址。
野指針:用malloc和new 分配了內(nèi)存,就得用free和delete 釋放,否則造成內(nèi)存泄漏,但是只釋放內(nèi)存還是不夠安全的,必須在釋放內(nèi)存后,讓指針指向NULL,才不至于造成野指針。我理解的野指針就是沒有正確指向的指針。
總結(jié)
以上是生活随笔為你收集整理的宏定义和内联函数的学习的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 联想万全服务器系列,联想服务器万全系列慧
- 下一篇: mysql优化之连接优化