在通過一個項目時,我看到內存數據是「8字節對齊」。任何人都可以請解釋這是什麼意思?「內存是8字節對齊」是什麼意思?
回答
一個目的即是「對齊8個字節」被存儲在該是8
許多處理器將只加載從對齊位置某些數據類型的倍數的存儲器地址;在其他CPU上,這種訪問速度更快。使用內存對齊還有其他幾個可能的原因 - 沒有看到代碼很難說明原因。
對齊訪問更快,因爲外部總線向存儲器不是一個單一的字節寬的 - 它通常是4或8個字節寬(或更寬)。這意味着CPU一次不會獲取單個字節 - 它會從請求的地址開始讀取4或8個字節。因此,內存地址的2或3個最低有效位實際上並不由CPU發送 - 外部存儲器只能在總線寬度倍數的地址讀寫。如果你在地址「9」處請求了一個字節,CPU實際上會向內存請求從地址8開始的字節塊,並將第二個字節加載到你的寄存器中(丟棄其他字節)。
這意味着一個對齊的訪問可能需要從內存中讀取:如果您要求開始在地址9 8個字節,CPU必須取8個字節地址8開始,也是8個字節開始在地址16,然後掩蓋你想要的字節。另一方面,如果您要求從地址8開始的8個字節,則只需要一次獲取。一些CPU甚至不會執行這種錯位的負載 - 他們只會引發異常(甚至默默地加載錯誤的數據!)。
「X字節對齊」表示數據的基址必須是X的倍數。它可以用於在某些特殊硬件中使用某些特殊硬件,如DMA,以便更快速地訪問CPU等。 ...
這是細胞處理器的情況下,其中數據必須是16字節對齊,以便複製到/從協處理器。
好的。 但是當X字節對齊時執行速度如何變快? 由於更容易計算內存地址或其他東西? 也有任何功能對齊? /Kanu__ – 2010-05-17 06:03:48
嗯,這取決於你的架構。例如,如果你有一個32位體系結構,並且你的內存只能以4個字節訪問4個地址倍數(4個字節對齊),那麼將它的4個字節數據(例如:整數) 。如果它不對齊,它將允許您在一次內存讀取中訪問它,而不是兩次。 (注意:這種情況是假設的) – Phong 2010-05-17 06:22:29
通常你的編譯器會執行所有的優化,所以你不必管理它。在一些非常特殊的情況下,您可能需要自己指定它(例如:Cell處理器或您的項目硬件)。如果您正在致力於傳統架構,那麼您確實不需要這樣做。 – Phong 2010-05-17 06:24:58
內存對齊對於不同方式的性能很重要。它有一個硬件相關的原因。自80年代以來,CPU和內存之間的訪問時間有所不同。處理器的速度快於內存的速度。隨着時間的推移,這種差異越來越大(例如:在Apple II上,CPU頻率爲1.023 MHz,內存頻率爲兩倍,CPU爲1個週期,視頻爲1個週期。在CPU上約3GHz,內存僅有400MHz)。解決內存變慢問題的一個辦法是在更大的總線上訪問它,而不是每次訪問1個字節,CPU將從內存中讀取64位寬的字。這意味着,即使您從內存中讀取1個字節,總線也會提供一個完整的64位(8字節字)。存儲器將在地址0,8,16,24,32,40等處具有這8個字節單元,爲8的倍數。如果訪問例如地址4處的8字節字,則硬件將不得不讀取字在地址0處,屏蔽該字的高4字節,然後在地址8處讀取字,屏蔽該字的低部分,將其與前半部分結合並將其提供給寄存器。正如你可以看到一個非常複雜(因此很慢)的操作。這是人們喜歡對齊內存訪問的第一個原因。我會在2小時內給出另一個理由。
謝謝。 好的。 我在等你的第二個理由。 – 2010-05-19 04:32:49
對不起,忘記了。沒有第二個原因。在我寫這篇文章的那一刻,我想到了數組元素的大小和數組,這並不完全是對齊的。但是大小爲2的冪,具有易於計算的優點。某些CPU甚至有地址模式,可以直接乘以2,4或8,而不會受到懲罰(例如x86和68020)。但如前所述,它與對齊無關。 – 2010-05-19 13:03:11
。謝謝(你的)信息。 /renjith_g – 2010-05-19 13:12:07
如果內存數據是8字節對齊,則表示:sizeof(the_data) % 8 == 0
。一般用C語言編寫,如果一個結構被建議爲8字節對齊,其大小必須乘以8,如果不是,手動或編譯器需要填充。一些編譯器提供指令來使結構與n字節對齊,對於VC,它是#prgama pack(8)
,對於gcc,它是__attribute__((aligned(8)))
。
所以我們可以說一個人正在處理浮點(單一)數據上的SSE(128位)。然而數據長度是38.該過程將數據乘以常數。開發人員應該如何處理這個問題? – Royi 2016-07-19 05:58:19
- 1. 什麼意思是「緩存線對齊」?
- 2. 「real * 8」是什麼意思?
- 3. 對齊堆棧是什麼意思?
- 4. 「......的字節分配內存不足」是什麼意思? (Android)
- 5. 是什麼意思:是什麼意思?
- 6. 對齊節的開始是什麼意思?
- 7. 「內存標籤70」是什麼意思?
- 8. 這是什麼意思系統內存
- 9. 鏈內是什麼意思?
- 10. 消息「3字節UTF-8序列的無效字節2」是什麼意思?
- 11. 在Apache Spark內存中MemoryStore tryToPut什麼意思是什麼意思
- 12. %{}是什麼意思?
- 13. '#'是什麼意思?
- 14. 「?」是什麼意思?
- 15. #{...}是什麼意思?
- 16. || =是什麼意思?
- 17. @是什麼意思
- 18. $$ $$是什麼意思?
- 19. `/ * @`是什麼意思?
- 20. 「=」是什麼意思
- 21. + =是什麼意思?
- 22. {..} [..]是什麼意思?
- 23. 什麼是:!:意思?
- 24. @ []是什麼意思?
- 25. 什麼是「||」意思?
- 26. /([^.]*)\.(.*)/是什麼意思?
- 27. &**是什麼意思?
- 28. @(...)是什麼意思?
- 29. &@是什麼意思?
- 30. 「\\。\」,「\ ?? \」,「\\?\」,「\\」是什麼意思?
含義,如果第一個位置是0x0000那麼第二個位置應該是0x0008 .. 這8個字節對齊類型的優點是什麼? – 2010-05-17 06:00:56