2012-02-06 166 views
1

如果執行速度是重要的,應該使用這一點,2D陣列與結構(C++)

struct myType { 

    float dim[3]; 
}; 

myType arr[size]; 

,或者使用2D陣列作爲arr[size][index]

+2

爲什麼你認爲會有什麼區別?你是否按照特定的配置對它進行了計時? – 2012-02-06 21:00:13

+1

這可能沒關係。但是,如果速度對你很重要,*測量*目標平臺上的兩種方法。 – 2012-02-06 21:00:32

+1

如果速度很重要,請編寫最易維護的代碼,並讓編譯器爲您優化它。 (除非你進行了基準測試,並發現了一個瓶頸,當然,這是該規則例外的唯一良好藉口。) – 2012-02-06 21:01:18

回答

1

這取決於您的使用情況。如果你通常一起使用這三個維度,那麼struct組織可能是合理的。尤其是當單獨使用維度時,陣列布局最有可能帶來更好的性能:當代處理器不僅僅加載單個單詞,而是加載緩存行單元。如果僅使用部分數據,則會加載未使用的單詞。

並行處理也更容易獲得陣列布局,例如,使用SIMD操作。這在一定程度上是不幸的,因爲對象佈局通常是不同的。實際上,你使用的陣列可能是相似的,但如果你改變了東西變成float array[3][size]事情變得不同了。

1

沒有區別的。選擇更可讀的東西。

除非你正在一個奇怪的平臺上工作,那麼這兩者的內存佈局將是相同的 - 對於編譯器來說,這是最重要的。

2

沒關係。無論在幾乎所有情況下,編譯器都會生成完全相同的代碼。唯一的區別是如果結構引發某種填充,但考慮到你有看起來不太可能的漂浮物。

1

唯一的區別是當你將某些東西傳遞給函數時。 當您使用數組解決方案時,您從不復制包含數組的數組,但僅傳遞數組地址。 如果在struct解決方案中沒有顯式傳遞結構地址,那麼結構總是會被複制。

0

您可能想要將2d數組映射到1d。可能更容易緩存

1

需要注意的另一件事是另一張海報提到:如果昏暗在結構中總是有3的大小,但集合實際上代表「紅色,綠色,藍色」或「 X,Y,Z「或」汽車,卡車,小船「,從維修的角度來看,你最好把它們拆掉。也就是說,使用類似

typedef struct VEHICLES 
{ 
    float fCar; 
    float fTruck; 
    float fBoat; 
} Vehicles; 

這樣,當你回來兩年調試它,或者別人有來看待它,他們不會去猜測什麼樣暗淡[0],暗淡[1 ]和dim [2]指的是。