2012-09-16 26 views
7

對不起,如果這個問題聽起來很愚蠢。我只是模糊地認識到數據對齊的問題,從未做過任何64位編程。我正在處理一些32位x86代碼。它經常訪問一個int數組。有時會讀取一個32位整數。有時讀兩個或更多。在某些時候,我想讓代碼成爲64位。我不確定是否應該將這個int數組聲明爲intlong int。我寧願保持整數的寬度相同,所以我不必擔心差異。我有點擔心,儘管讀取/寫出與自然詞不一致的地址可能會很慢。是否有性能損失在x86-64中訪問32位整數數組?

+1

如果你想固定寬度的整數嘗試:'int32_t'在''' – Mysticial

+0

是int'天然型的結構。除非你有充分的理由使用不同的類型,否則不要。 –

+0

@PeteBecker不,它不是。在今天大多數系統中,「int」仍然只有32位。 – Mysticial

回答

7

僅當加載或商店穿過對齊邊界時纔會出現未對齊罰分。邊界是通常中的較小值:硬件的自然字長

  • 。 (32位或64位*)
  • 數據類型的大小。

如果您在64位(8字節)體系結構上加載4字節字。它不需要是8字節對齊的。它只需要4字節對齊。

同樣,如果你在任何機器上加載一個1字節的字符,它根本不需要對齊。

*請注意,SIMD向量可能意味着更大的自然字大小。例如,16字節的SSE在x86和x64上仍然需要16字節對齊。 (除非明確錯位加載/存儲)


因此,在短期,不,你不必擔心數據對齊。語言和編譯器很難阻止你擔心它。

所以只要堅持任何數據類型對你最有意義。

3

64位x86 CPU仍然針對高效處理32位值進行了大量優化。即使在64位操作系統上,訪問32位值的速度至少與訪問64位值的速度一樣快。在實踐中,它實際上會更快,因爲更少的緩存空間和內存帶寬被消耗。

1

無論何時訪問任何內存位置,整個高速緩存行都會讀入L1高速緩存,並且對該行中任何內容的任何後續訪問都儘可能快。除非你的32位訪問跨越一個緩存行(如果它是32位對齊,那麼它不會),它將像64位訪問一樣快。

+0

不完全。訪問1值將是相同的。如果您訪問另一個* 32位的值,它位於同一緩存行中,它將已經存在 - 您甚至可以用「後續...」來說明這一點。由於每個緩存行加載更多數據元素,因此使用較小的數據大小通常會更容易緩存。 – phkahler

相關問題