2013-08-28 238 views
4

今天早上我已經和同事討論過這個話題。他說,將數組作爲指針數組分配總是比較好,因爲分別分配每個元素有更好的機會獲得一個空閒的內存塊。 Somethink這樣的:指針陣列與元素陣列

// Consider n_elements as a dynamic value 
int n_elements = 10, i; 
int **ary = (int **) malloc(sizeof(int *) * n_elements); 

for(i = 0; i < n_elements; i++) 
{ 
    ary[i] = (int *) malloc(sizeof(int)); 
} 

至於反對他的做法,我認爲這是更好地分配元素的數組,只是因爲你會得到一個緊湊的內存塊,而不是一堆周圍堆蔓延引用。類似這樣的:

int n_elements = 10; 
int *ary = (int *) malloc(sizeof(int) * n_elements); 

ary[0] = 100; 

在這次對話之後,我一直在想它,而且我的最終結論是,它取決於。由於我上面提到的原因,我發現第二種解決方案是一種更好的方法,但是在分配大型結構數組時可能會比第一種更好。

除了我的結論之外,您對此有何看法?

+2

就像你說的,「這取決於」。 :) – lurker

+4

對於需要10個整數,你會瘋了。使用'int a [10];'對於一個連續的N個項目序列,後者(減去'malloc()')的轉換將是要走的路(*很少*不是這種情況)。前者通常只在您需要任意長度的項目列表的任意長度列表時纔會完成,在使用2D數組期間提供*語法*(實際上其實是任何事情)。但是,它最終取決於您的特殊需求。 – WhozCraig

+1

這不主要是基於意見的。大聲笑。 –

回答

6

他對我能想到的任何主流硬件都是錯誤的。 (至少在一般情況下)。它可能會有所不同,可能會有一些特殊情況。如果可以,請在指針數組上選擇數組元素。

CPU緩存像數據要連續打包。分別分配每個元素將增加緩存未命中,分配時間較慢和浪費內存(由於分配對齊)。 CPU速度和內存之間的差距每年都在增加,從而增加了連續打包數據和批處理操作的好處。

您應該閱讀本問題描述的文檔What Every Programmer Should Know About Memory。它詳細描述了現代CPU /內存關係的所有細節以及爲什麼連續數據非常重要。

+2

而且,對於用戶定義的類型(如果導致內存碎片很大) –

+3

異常是一個大而稀疏訪問的數組,最好每個條目都可能分配在其引用的其他內容附近。但是,這取決於有一堆可能分配接近地址內的近乎時間的東西。 –

+1

@HotLicks +1這將是一個很好的例外情況。 – WhozCraig