2017-09-27 63 views
-1

我想知道哪一個更好,2個數組或者具有2個數據成員的結構的數組。 我想要關於以下方面的見解:2數組vs 2個數據成員的結構陣列

  1. struct是一種包含額外內存的包裝嗎?我知道結構中的填充符合詞的限制。
  2. 如果我想同時訪問兩個數據成員,哪一個更快?我認爲它的結構陣列。
  3. 由於結構填充的可能性,一個結構的數組可能會佔用比2個數組更多的內存。

在一般情況下和語言特定的答案都是受歡迎的。

請不要建議看看SoA和AoS問題,已經這樣做了。

回答

1

這完全取決於你想要做什麼,既不是答案總是「正確」。

  1. 外特定於編譯器的填充物,除非你把它虛擬的結構不佔用任何額外的內存,在這種情況下,它會得到一個虛函數表指針,但僅此而已。

  2. 只要您的計算機具有足夠大的緩存以容納兩頁(通常每個4KB,但檢查特定的CPU),則無關緊要,您應該選擇哪一個更容易工作與你的代碼更有意義。結構數組將使用一個頁面,並導致每加載一個4KB的結構會導致一次高速緩存未命中,而值的數組將加載兩個導致兩次高速緩存未命中的頁面。如果你碰巧正在使用一個只允許一個緩存用於你的程序數據的dinky緩存,那麼是的,使用一個結構數組將會快得多,因爲替代方法會導致每次讀取都會導致緩存未命中。

  3. 與#1相同的答案 - 數組永遠不會有自己的填充,但是一個結構體可能會使用編譯器內置的填充。

雖然struct padding完全取決於你的編譯器,它可能有標誌來打開或關閉它或設置最大焊盤尺寸或其他。檢查對象數組的原始數據以查看它們是否有填充,如果有,請在需要時使用編譯器瞭解如何在編譯器中關閉該數據。

你正在使用什麼編譯器,你想用你的項目做什麼?

也許更重要的是:你的項目在哪個階段,你是否遇到過速度問題?預先優化是所有弊端的根源,而且你可能會浪費你的時間擔心這個問題。

+0

這只是一個想法,我只是想解決一個編程問題。 –

0
  1. 填充結構以允許CPU對成員進行最佳訪問,以便它們可能需要更多內存。這些字段可能已經對齊,因此不需要填充。所以它們不是一個包裝,因爲它們總是包裝着數據。考慮編譯器的結構填充/優化調整。
  2. 由於整個結構可能適合緩存在一起,結構將會更快。如果您有單獨的列表,它們可能會脫離緩存。
  3. 如果填充,是的。

不要忘記保持數據在一起的一個重要原因:代碼可讀性。如果您打算獨立處理每個字段的不同線程。如果您使用陣列,可能會提高性能。