對不起,如果這個問題聽起來很愚蠢。我只是模糊地認識到數據對齊的問題,從未做過任何64位編程。我正在處理一些32位x86代碼。它經常訪問一個int數組。有時會讀取一個32位整數。有時讀兩個或更多。在某些時候,我想讓代碼成爲64位。我不確定是否應該將這個int數組聲明爲int
或long int
。我寧願保持整數的寬度相同,所以我不必擔心差異。我有點擔心,儘管讀取/寫出與自然詞不一致的地址可能會很慢。是否有性能損失在x86-64中訪問32位整數數組?
回答
僅當加載或商店穿過對齊邊界時纔會出現未對齊罰分。邊界是通常中的較小值:硬件的自然字長
- 。 (32位或64位*)
- 數據類型的大小。
如果您在64位(8字節)體系結構上加載4字節字。它不需要是8字節對齊的。它只需要4字節對齊。
同樣,如果你在任何機器上加載一個1字節的字符,它根本不需要對齊。
*請注意,SIMD向量可能意味着更大的自然字大小。例如,16字節的SSE在x86和x64上仍然需要16字節對齊。 (除非明確錯位加載/存儲)
因此,在短期,不,你不必擔心數據對齊。語言和編譯器很難阻止你擔心它。
所以只要堅持任何數據類型對你最有意義。
有可以在這裏找到很多很好的信息: Performance 32 bit vs. 64 bit arithmetic
甚至更多的信息https://superuser.com/questions/56540/32-bit-vs-64-bit-systems,這裏的答案聲稱見過的最糟糕的5%放緩(從應用的角度,而不是單個操作)。
簡短的回答是否定的,你不會採取性能打擊。
64位x86 CPU仍然針對高效處理32位值進行了大量優化。即使在64位操作系統上,訪問32位值的速度至少與訪問64位值的速度一樣快。在實踐中,它實際上會更快,因爲更少的緩存空間和內存帶寬被消耗。
無論何時訪問任何內存位置,整個高速緩存行都會讀入L1高速緩存,並且對該行中任何內容的任何後續訪問都儘可能快。除非你的32位訪問跨越一個緩存行(如果它是32位對齊,那麼它不會),它將像64位訪問一樣快。
不完全。訪問1值將是相同的。如果您訪問另一個* 32位的值,它位於同一緩存行中,它將已經存在 - 您甚至可以用「後續...」來說明這一點。由於每個緩存行加載更多數據元素,因此使用較小的數據大小通常會更容易緩存。 – phkahler
- 1. 是否有任何性能損失
- 2. 在32位整數
- 3. 導致在32位代碼中使用64位變量的性能損失
- 4. 性能損失在基類中訪問屬性(C#)
- 5. 是否有可能以線性時間排序整數數組?
- 6. 如何使用Python檢查數字是否是32位整數?
- 7. 將8位整數數組移動到32位數組程序
- 8. 提取函數是否會導致性能損失?
- 9. 在@try塊內調用一個函數是否會有性能損失?
- 10. 是否有可能訪問相同的數組中的鍵 - PHP?
- 11. 構造函數的命名/可選參數是否存在性能損失?
- 12. C++:將64位整數與32位整數比較是否安全?
- 13. 是否有可能具有整數數組中的jquery
- 14. 只有2個元素的元組是否有任何性能損失?
- 15. 函數在GLSL中有性能損失嗎?
- 16. 在RegExp#test中使用捕獲組是否存在性能損失?
- 17. Javascript xor 32位整數問題
- 18. Fortran中是否存在CPU_time()性能損失?
- 19. 「模擬」 64位整數有兩個32位整數
- 20. gcc中是否有128位整數?
- 21. 是否值得將64位整數轉換爲火花數據幀中的32位(16位)整數?
- 22. 解析JSON數據集時,JSON中的空數組是否會損害性能?
- 23. 重複調用UIGraphicsGetCurrentContext時是否有任何性能損失
- 24. 從其他程序集加載類是否有性能損失?
- 25. 每次在foreach循環中訪問count($ array)會有性能損失嗎?
- 26. 是否有可能重寫Java中的整數數組?
- 27. 是NSInteger一個32位整數
- 28. 是否有可能在Array中的Swift中訪問數組中的String?
- 29. Python中,如何將32位整數放入字節數組中
- 30. 未定義參數的性能損失
如果你想固定寬度的整數嘗試:'int32_t'在''' –
Mysticial
是int'天然型的結構。除非你有充分的理由使用不同的類型,否則不要。 –
@PeteBecker不,它不是。在今天大多數系統中,「int」仍然只有32位。 – Mysticial