?? c
字號:
<html xmlns:v="urn:schemas-microsoft-com:vml"
xmlns:o="urn:schemas-microsoft-com:office:office"
xmlns:w="urn:schemas-microsoft-com:office:word"
xmlns="http://www.w3.org/TR/REC-html40">
<head>
<META http-equiv=Content-Type content="text/html; charset=gb2312">
<STYLE type=text/css>TD {
FONT-SIZE: 9pt; LINE-HEIGHT: 16px
}
A {
COLOR: #003399; TEXT-DECORATION: none
}
A:hover {
COLOR: #ff6600; TEXT-DECORATION: underline
}
.newtx {
BORDER-RIGHT: 1px groove; BORDER-TOP: 1px groove; FONT-SIZE: 9pt; BORDER-LEFT: 1px groove; WIDTH: 120px; BORDER-BOTTOM: 1px groove; HEIGHT: 19px
}
.newbt {
BORDER-RIGHT: 1px ridge; BORDER-TOP: 1px ridge; FONT-SIZE: 9pt; BORDER-LEFT: 1px ridge; WIDTH: 50px; BORDER-BOTTOM: 1px ridge; BACKGROUND-COLOR: #a2afc6
}
.a1 {
COLOR: #000000; TEXT-DECORATION: none
}
.a2 {
LINE-HEIGHT: 18px
}
.f1 {
FONT-SIZE: 12px; LINE-HEIGHT: 20px
}
.f2 {
FONT-SIZE: 12pt; LINE-HEIGHT: 22px
}
</STYLE>
<title>C程序優化 - 內存篇</title>
</head>
<BODY BACKGROUND="..\back\bg.gif" leftmargin="0" topmargin="0" marginheight="0" marginwidth="0">
<h1 align="center"><FONT COLOR="#FF0000"><B><SPAN STYLE='font-size:18.0pt;mso-bidi-font-size:12.0pt'><FONT CLASS=title
COLOR=#ff0000><B><BR>C程序優化 - 內存篇</B></FONT></SPAN></B></FONT></h1><P ALIGN="CENTER"><B>liyuming1978(原作)</B></P><TABLE WIDTH="94%" ALIGN="CENTER"><TR><TD class=f2><P>I.優化數組的尋址</P><P>
在編寫程序時,我們常常使用一個一維數組a[M×N]來模擬二維數組a[N][M],這個時候訪問a[]一維數組的時候:我們經常是這樣寫a[j×M+i](對于a[j][i])。這樣寫當然是無可置疑的,但是顯然每個尋址語句j×M+i都要進行一次乘法運算。現在再讓我們看看二維數值的尋址,說到這里我們不得不深入到C編譯器在申請二維數組和一維數組的內部細節上――實際在申請二位數組和一維數組,編譯器的處理是不一樣的,申請一個a[N][M]的數組要比申請一個a[M×N]的數組占用的空間大!二維數組的結構是分為兩部分的:</P><P>①
是一個指針數組,存儲的是每一行的起始地址,這也就是為什么在a[N][M]中,a[j]是一個指針而不是a[j][0]數據的原因。</P><P>② 是真正的M×N的連續數據塊,這解釋了為什么一個二維數組可以象一維數組那樣尋址的原因。(即a[j][i]等同于(a[0])[j×M+i])</P><P> 清楚了這些,我們就可以知道二維數組要比(模擬該二維數組的)一維數組尋址效率高。因為a[j][i]的尋址僅僅是訪問指針數組得到j行的地址,然后再+i,是沒有乘法運算的!</P><P>
所以,在處理一維數組的時候,我們常常采用下面的優化辦法:(偽碼例子)</P><P> int a[M*N];<BR>int *b=a;<BR>for(…){<BR> b[…]=…;<BR> …………<BR> b[…]=…;<BR> b+=M;<BR>}</P><P> 這個是遍歷訪問數組的一個優化例子,每次b+=M就使得b更新為下一行的頭指針。當然如果你愿意的話,可以自己定義一個數組指針來存儲每一行的起始地址。然后按照二維數組的尋址辦法來處理一維數組。不過,在這里我建議你干脆就直接申請一個二維數組比較的好。下面是動態申請和釋放一個二維數組的C代碼。</P><P>int
get_mem2Dint(int ***array2D, int rows, int columns) // h.263源代碼<BR>{<BR> int
i;<BR> if((*array2D = (int**)calloc(rows, sizeof(int*))) == NULL) no_mem_exit(1);<BR> if(((*array2D)[0]
= (int* )calloc(rows*columns,sizeof(int ))) == NULL) no_mem_exit(1);<BR> for(i=1
; i<rows ; i++)<BR> (*array2D)[i] = (*array2D)[i-1] + columns ;<BR> return
rows*columns*sizeof(int);<BR>}</P><P>void free_mem2D(byte **array2D)<BR>{<BR> if
(array2D){<BR> if (array2D[0]) free (array2D[0]);<BR> else error ("free_mem2D:
trying to free unused memory",100);<BR> free (array2D);<BR> } else{<BR> error
("free_mem2D: trying to free unused memory",100);<BR> }<BR>}</P><P> 順便說一下,如果你的數組尋址有一個偏移量的話,不要寫為a[x+offset],而應該為
b=a+offset,然后訪問b[x]。</P><P> 不過,如果你不是處理對速度有特別要求的程序的話,這樣的優化也就不必要了。記住,如果編普通程序的話,可讀性和可移值性是第一位的。</P><P>
</P><P>II.從負數開始的數組</P><P> 在編程的時候,你是不是經常要處理邊界問題呢?在處理邊界問題的時候,經常下標是從負數開始的,通常我們的處理是將邊界處理分離出來,單獨用額外的代碼寫。那么當你知道如何使用從負數開始的數組的時候,邊界處理就方便多了。下面是靜態使用一個從-1開始的數組:</P><P>int
a[M];</P><P>int *pa=a+1;</P><P> 現在如果你使用pa訪問a的時候就是從-1到M-2了,就是這么簡單。(如果你動態申請a的話,free(a)可不要free(pa)因為pa不是數組的頭地址)</P><P>
</P><P>III.我們需要鏈表嗎</P><P> 相信大家在學習《數據結構》的時候,對鏈表是相當熟悉了,所以我看有人在編寫一些耗時算法的時候,也采用了鏈表的形式。這樣編寫當然對內存的占用(似乎)少了,可是速度呢?如果你測試:申請并遍歷10000個元素鏈表的時間與遍歷相同元素的數組的時間,你就會發現時間相差了百倍!(以前測試過一個算法,用鏈表是1分鐘,用數組是4秒鐘)。所以這里我的建議是:在編寫耗時大的代碼時,盡可能不要采用鏈表!</P><P>
其實實際上采用鏈表并不能真正節省內存,在編寫很多算法的時候,我們是知道要占用多少內存的(至少也知道個大概),那么與其用鏈表一點點的消耗內存,不如用數組一步就把內存占用。采用鏈表的形式一定是在元素比較少,或者該部分基本不耗時的情況下。</P><P> (我估計鏈表主要慢是慢在它是一步步申請內存的,如果能夠象數組一樣分配一個大內存塊的話,應該也不怎么耗時,這個沒有具體測試過。僅僅是猜想
:P)</P><P></P></TD></TR></TABLE><br>
</body>
</html>
<html></html>亚洲欧美第一页_禁久久精品乱码_粉嫩av一区二区三区免费野_久草精品视频
97久久超碰精品国产|
亚洲成人一二三|
91麻豆精品在线观看|
日本视频一区二区|
综合欧美亚洲日本|
日韩精品一区二区三区蜜臀|
91视频免费播放|
国产精品资源网站|
日本怡春院一区二区|
亚洲免费av网站|
欧美精品一区二区三区一线天视频|
91理论电影在线观看|
久久成人精品无人区|
亚洲一区二区三区国产|
国产精品美女一区二区|
精品久久久久久久人人人人传媒|
欧美午夜影院一区|
不卡视频一二三|
国产**成人网毛片九色|
麻豆国产欧美一区二区三区|
亚洲尤物视频在线|
国产精品麻豆久久久|
精品久久国产字幕高潮|
91麻豆精品国产91久久久久久久久
|
www.亚洲激情.com|
日韩伦理电影网|
91丨九色丨蝌蚪富婆spa|
亚洲免费观看高清完整版在线观看熊
|
国产真实乱对白精彩久久|
欧美zozozo|
91小视频免费看|
26uuu另类欧美|
欧美一区二区免费|
欧美精品乱码久久久久久|
91福利视频久久久久|
91在线播放网址|
99国产精品99久久久久久|
成人国产精品免费观看视频|
久99久精品视频免费观看|
日本亚洲一区二区|
日韩成人一区二区|
日本不卡免费在线视频|
天堂蜜桃91精品|
天堂影院一区二区|
午夜亚洲国产au精品一区二区|
亚洲乱码国产乱码精品精的特点|
国产精品久久久久aaaa|
国产精品乱码一区二三区小蝌蚪|
欧美激情一区二区三区蜜桃视频|
中文字幕av资源一区|
国产精品私人影院|
国产精品国产三级国产aⅴ入口
|
欧美自拍偷拍午夜视频|
欧美日韩在线播放一区|
6080国产精品一区二区|
91精品国产综合久久香蕉麻豆|
欧美福利视频一区|
日韩女同互慰一区二区|
久久综合九色综合97_久久久|
久久免费视频色|
中文字幕乱码久久午夜不卡|
中文字幕视频一区|
亚洲制服丝袜av|
日韩av一区二区三区|
久久草av在线|
国产成人av网站|
99视频精品全部免费在线|
色噜噜夜夜夜综合网|
欧美区在线观看|
久久综合色8888|
专区另类欧美日韩|
91国偷自产一区二区开放时间|
欧美精品一二三四|
亚洲欧美综合在线精品|
亚洲人精品午夜|
亚洲一区在线观看免费观看电影高清
|
欧美成人午夜电影|
久久精品欧美一区二区三区不卡|
久久九九久久九九|
国产精品日韩精品欧美在线|
欧美日韩三级一区|
精品国产一区二区精华
|
国产精品女同一区二区三区|
亚洲精品水蜜桃|
成人性生交大合|
欧美亚洲综合网|
久久女同精品一区二区|
亚洲精品成人在线|
美女www一区二区|
av电影天堂一区二区在线
|
91福利视频久久久久|
精品粉嫩超白一线天av|
亚洲综合免费观看高清完整版
|
国产欧美日韩三级|
亚洲成av人片一区二区三区|
国产激情91久久精品导航|
欧美在线免费播放|
wwwwxxxxx欧美|
亚洲午夜精品17c|
夜夜嗨av一区二区三区四季av|
国产乱妇无码大片在线观看|
欧美日韩视频第一区|
日本一区二区三区国色天香|
男人的j进女人的j一区|
成人高清视频在线|
精品久久人人做人人爰|
一区二区激情小说|
成人免费高清在线|
777a∨成人精品桃花网|
亚洲一区精品在线|
老司机午夜精品99久久|
欧美色窝79yyyycom|
国产精品欧美一区二区三区|
日本女优在线视频一区二区|
色婷婷精品大视频在线蜜桃视频|
精品理论电影在线|
美女诱惑一区二区|
91丨国产丨九色丨pron|
www成人在线观看|
美女国产一区二区三区|
国产午夜亚洲精品不卡|
日本不卡免费在线视频|
欧美日韩亚洲丝袜制服|
日韩一区欧美小说|
av在线这里只有精品|
欧美精品一区二区高清在线观看|
久久国产成人午夜av影院|
欧美影院午夜播放|
亚洲国产成人av网|
91精品午夜视频|
欧美日韩你懂得|
xf在线a精品一区二区视频网站|
亚洲精品国久久99热|
av欧美精品.com|
国产欧美一区在线|
国产激情一区二区三区四区|
欧美一卡2卡3卡4卡|
久久精品国产澳门|
宅男噜噜噜66一区二区66|
日韩精品午夜视频|
99国内精品久久|
国产精品国产精品国产专区不片|
成人一区二区三区中文字幕|
日韩午夜激情av|
国产在线精品不卡|
日韩丝袜美女视频|
韩国三级在线一区|
亚洲精品一区在线观看|
久久99精品久久久|
欧美性猛交xxxxxx富婆|
性久久久久久久久|
日韩一区二区三区高清免费看看|
日韩精彩视频在线观看|
日韩一区二区三区精品视频|
日韩专区欧美专区|
欧美mv日韩mv|
久久激情综合网|
国产嫩草影院久久久久|
国产99久久久精品|
亚洲欧美日韩国产综合在线|
欧美日韩在线观看一区二区
|
成人免费黄色大片|
欧美国产激情一区二区三区蜜月|
91视频在线看|
欧美成人精品二区三区99精品|
国产馆精品极品|
亚洲欧美日本在线|
欧美日韩你懂的|
国内精品自线一区二区三区视频|
久久久五月婷婷|
av爱爱亚洲一区|
亚洲高清免费在线|
久久久不卡网国产精品一区|
国产一区二区看久久|
国产精品午夜电影|
欧美色网一区二区|
久久国产精品一区二区|
蜜桃av噜噜一区|
人人爽香蕉精品|
成人精品国产福利|
一本色道a无线码一区v|
激情综合网天天干|
精品一区二区三区在线观看|
日韩高清电影一区|
狠狠色伊人亚洲综合成人|
青青青伊人色综合久久|
日本美女一区二区三区|
亚洲国产另类av|
麻豆中文一区二区|
亚洲成人av在线电影|
色综合中文字幕|
欧美私模裸体表演在线观看|
日本欧美一区二区三区乱码|
精品国产免费一区二区三区四区|
色综合久久88色综合天天免费|
午夜不卡av在线|
亚洲欧洲www|
欧美日韩一区成人|
黑人精品欧美一区二区蜜桃|
亚洲综合丝袜美腿|