線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1314
推到 Plurk!
推到 Facebook!

多維動態記憶體問題

答題得分者是:syntax
small7011
一般會員


發表:19
回覆:34
積分:10
註冊:2007-07-24

發送簡訊給我
#1 引用回覆 回覆 發表時間:2008-09-16 17:29:57 IP:211.20.xxx.xxx 訂閱
請問各位前輩,我想要宣告一個二維的動態記憶體陣列,這兩種方式是否相同.
[code cpp]
第一種形式
int **ptr = new int *[n];
for( int i=0;i{
int *ptr[i] = new int [m]
}
第二種形式
int *ptr =new int [n*m];

[/code]
------
lee
ikk
尊榮會員


發表:4
回覆:413
積分:768
註冊:2003-06-30

發送簡訊給我
#2 引用回覆 回覆 發表時間:2008-09-17 09:41:18 IP:163.28.xxx.xxx 訂閱
不一樣, 第二種方式, 是一維陣列


[code cpp]
第一種初始化陣列值
for( int i=0;i for( int j=0;j ptr[i][j] = 1;
第二種初始化陣列值
for( int i=0;i for( int j=0;j ptr1[i*j] = 1;
[/code]
------
FPGA驗證, FPGA開發平台, http://smims.com
qjzy2008
一般會員


發表:0
回覆:1
積分:0
註冊:2008-09-17

發送簡訊給我
#3 引用回覆 回覆 發表時間:2008-09-17 17:28:18 IP:58.49.xxx.xxx 訂閱
不相同,第一種在記憶體中是不連續分布的,而第二種卻是一快連續分布的區域,故您在訪問時這個陣列時的方式是不一樣。
編輯記錄
qjzy2008 重新編輯於 2008-09-17 17:29:47, 註解 無‧
syntax
尊榮會員


發表:26
回覆:1139
積分:1258
註冊:2002-04-23

發送簡訊給我
#4 引用回覆 回覆 發表時間:2008-09-18 09:40:26 IP:118.231.xxx.xxx 訂閱
不見得

1. 就宣告字面上與程式碼上,是不相同的,但也只限於此 [看法上的不同]
2. 就實際的記憶體來說,沒什麼差別,就是一個區域而已
3. 不一定會不連續分佈(就是一個區域而已),(分開宣告,可能會連續,也可能會分散,同時宣告,一般是連續,但,你能保證一定是連續嗎?去看看 OS 的書吧,大到一個程度,就不連續了,更不用說會被 Paging) (依據 OS 的作業方式,一個連續區域,有可能分散在不同的實體區域,但看起來,連續,用起來,也連續,所以底層技術不在這裡說明)所以要看你所謂的連續,是什麼,邏輯連續?還是實體連續?是個體執行空間?還是總體執行空間?

所以,都對,也都不完全對,只端看你用什麼角度來理解,沒有正確答案,只有「不會出錯/當機」的用法(而且用法不只一種)

簡單化一下,假設,方法1 與 2 都是取得連續配置的記憶體空間 (邏輯連續),取得一塊 6 x 9 = 54 的空間

如果是二為陣列 x = 0~5, y = 0~8

則 ptr[x][y] 兩種 ptr[5][2] 都可以存取到 x = 6, y = 3 的位置 位置 18

同樣看成一維陣列 ptr[17] 也都是第 18 個位置 (ptr[17][0], ptr[17], ptr[0][17])

因為對電腦而言,都是相對 ptr 的位置,至於到底幾維?看你如何分堆、分組

以上我也可以用 ptr = ptr 17,ptr[0] ; ptr[2][1][2],都是同一個位置 ,你還可以再分下去 ptr [] [] [] [] [] ... 但有意義嗎?只是浪費 Compile 在計算位址的時間,直接用 ptr[17]

如果一定要用 x,y,可以 x = 5, y = 2

location := (x 1) * (y 1) - 1; (不過這樣,還是一種效能上的耗損)

ptr[location]

幾維,有那麼重要嗎?就是因為都只在意幾維,所以大家指標都學不好,忽略本質,怎學得好?

思考一下

int *i 與 int**i 與 int ***i 與 int ****i ..... 除了宣告的意義上不同,用起來真的就不同了嗎?

最後還不都是一個指標,只指到一個位置,該位址是數字、是字串起點、是另一個指標,還不都是一個數值而已

是什麼是我們賦予的

所以用完整的宣告,可以讓程式碼「比較」看得懂,但是還是比不上良好的註解,所以我管他幾維,我都用 一個 * 來處理

若真的要分,我只能說,一次宣告一大塊記憶體,會比「分次」宣告小塊記憶體來得快,釋放也快,但是分批宣告,可以分批釋放,你說,那個好?

我說,根據需求,適用當下的,最好





===================引 用 qjzy2008 文 章===================
不相同,第一種在記憶體中是不連續分布的,而第二種卻是一快連續分布的區域,故您在訪問時這個陣列時的方式是不一樣。
small7011
一般會員


發表:19
回覆:34
積分:10
註冊:2007-07-24

發送簡訊給我
#5 引用回覆 回覆 發表時間:2008-09-19 17:29:01 IP:211.20.xxx.xxx 訂閱
謝謝各位指導,所以這兩種宣告的方式可以算是一樣的囉,只是記憶體存放的位置不一定是連續性嗎?
------
lee
aftcast
站務副站長


發表:81
回覆:1485
積分:1763
註冊:2002-11-21

發送簡訊給我
#6 引用回覆 回覆 發表時間:2008-09-19 17:31:06 IP:60.248.xxx.xxx 訂閱
SYNTAx寫了好多的感言,應該是感受很深吧!?  ^ ^ 不過我也很認同他講的!!

我補充一下看法: 在win 32 flate paging mode的記憶管理下,user mode 程式若要用到二維以上的必要性就剩下動態釋放記憶體的考量了。若記憶體的總需求量不是很大,那一定選用1維的。不僅管理方便,access快,也很容易看懂。

但system kernel mode的程式就可能要常用二維或以上的了,因為他要在有限的physical memory去處理多工。比如說paging這個機制就用到3-4層的區塊,os要去maintain這個table,並把page (logical space)映射至 frame(phyical space)。

user mode下就如syntax說的,都是連續的,你不用去管(也無法管)真實的連續性問題,反而要管量的問題。以量的考慮為主來決定是否要多維釋放。
------


蕭沖
--All ideas are worthless unless implemented--

C++ Builder Delphi Taiwan G+ 社群
http://bit.ly/cbtaiwan
系統時間:2024-05-03 11:56:39
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!