2010-05-26 235 views
1

是否存在調整矩形陣列大小的智能方法?調整矩形陣列的大小

double[,] temp = new double[newSize, originalSecondDimension]; 
Array.Copy(original, temp, original.Length); 

我擔心重複一個巨大的數組和必要的內存來做到這一點。 Array.Resize()在內部做什麼?

感謝,

阿爾貝託

回答

3

你應該推遲業績微優化,直到一個地步,你實際測量和觀察的問題。這就是說...

在.NET中調整數組的大小要求重新分配它們。 (通常)沒有間隙地佈置內存 - 因此,如果不將其移動到堆中的新位置,您就無法調整它的大小。

你通常不應該關心如何Resize()內部工作 - 但在這種情況下,the documentation居然明確地描述了發生的事情:

這種方法分配一個新的數組 指定大小,複製元素 從舊陣列到新陣列,然後 用 替換舊陣列。

請記住,.NET中的內存分配非常高效 - 它主要涉及將高水位標記指針移到堆的地址空間並清零內存。除非你正在分配一個非常大的數組,或者在一個緊密的循環中反覆這樣做,否則你不可能遇到問題。

在您的情況下,確實沒有更好的方式來調整多維數據的大小。但是 - 您應該強烈考慮將此行爲封裝在自定義類中。傳遞原始數組對象不是一個好主意 - 事情出錯的方式太多了。尤其是,因爲當調整大小時會有一個新的數組實例 - 這可能會破壞保留在舊數組實例引用上的任何代碼,並假定它們仍然有效。

您始終可以創建一個提供索引器屬性的類,並且具有多維數組的語法「外觀和感覺」,而不會實際暴露其中一個。不幸的是,據我所知,.NET類庫中沒有內置的多維集合類。但是,編寫一個簡單的包裝應該不會太難。順便說一句,如果你真的關心性能,你應該知道,.NET多維數組知道執行速度比一維甚至鋸齒狀數組慢(double[][])。

+1

有一點要提到,但是......不,沒有更好的方法來處理多維數據。 – AxelEckenberger 2010-05-26 13:27:55

+0

你可以有一個集合 – 2010-05-26 13:38:26

+0

@Joel Coehoorn:當然,*但我仍然會編寫一個包裝類來控制所需的語義*。例如,如果一個集合的大小可能大於其他集合(例如鋸齒形數組或集合集合),則可能會出現問題。只有OP知道他需要什麼 - 但封裝你想要的行爲絕不是一個壞主意 - 而不是在代碼中的多個地方傳播知識和規則。 – LBushkin 2010-05-26 13:41:55

2

是的,有一個更明智的方法:不要使用數組!如果您發現自己需要重新調整大小的數組,則應該使用集合類型。

+0

取決於。如果實現一個數學模型(其中的算法是使用向量,矩陣,超立方體等定義的),.NET數組可以是存儲數據的最佳/最有效的方式。即使他們需要一個封裝類,以便於使用。 – CuppM 2010-05-26 14:19:08

1

我的猜測是你不能。陣列。調整()需要一個ref T[],這表明它的工作原理是這樣的:

int[] a = new int[1]; 
int[] b = a; 
Array.Resize(b,2); 
Debug.Assert(a.Length == 1); 
Debug.Assert(b.Length == 2); 

如果陣列可以改變大小,然後在並行代碼中,你不能優化掉邊界檢查,你不得不做一些事情每個訪問來自大小的改變在你的腳下停止:

for (int i = 0; i < a.Length; i++) { sum += a[i]; } 

有可能是一個例外:它是理論上可以增加數組的大小提供的陣列不必被重新分配(內存對齊可能意味着就地調整字節大小[1]到字節[4]有可能)。然而,數組將被重新分配更爲常見,所以沒有必要擔心這一點。

+0

'Resize()'的文檔清楚地說明了它的工作方式:'這個方法分配一個指定大小的新數組,將舊數組中的元素複製到新數組中,然後用新數組替換舊數組。 – LBushkin 2010-05-26 14:20:34