2010-05-17 45 views

回答

27

一個目的即是「對齊8個字節」被存儲在該是8

許多處理器將只加載從對齊位置某些數據類型的倍數的存儲器地址;在其他CPU上,這種訪問速度更快。使用內存對齊還有其他幾個可能的原因 - 沒有看到代碼很難說明原因。


對齊訪問更快,因爲外部總線向存儲器不是一個單一的字節寬的 - 它通常是4或8個字節寬(或更寬)。這意味着CPU一次不會獲取單個字節 - 它會從請求的地址開始讀取4或8個字節。因此,內存地址的2或3個最低有效位實際上並不由CPU發送 - 外部存儲器只能在總線寬度倍數的地址讀寫。如果你在地址「9」處請求了一個字節,CPU實際上會向內存請求從地址8開始的字節塊,並將第二個字節加載到你的寄存器中(丟棄其他字節)。

這意味着一個對齊的訪問可能需要從內存中讀取:如果您要求開始在地址9 8個字節,CPU必須取8個字節地址8開始,也是8個字節開始在地址16,然後掩蓋你想要的字節。另一方面,如果您要求從地址8開始的8個字節,則只需要一次獲取。一些CPU甚至不會執行這種錯位的負載 - 他們只會引發異常(甚至默默地加載錯誤的數據!)。

+1

含義,如果第一個位置是0x0000那麼第二個位置應該是0x0008 .. 這8個字節對齊類型的優點是什麼? – 2010-05-17 06:00:56

4

「X字節對齊」表示數據的基址必須是X的倍數。它可以用於在某些特殊硬件中使用某些特殊硬件,如DMA,以便更快速地訪問CPU等。 ...

這是細胞處理器的情況下,其中數據必須是16字節對齊,以便複製到/從協處理器。

+0

好的。 但是當X字節對齊時執行速度如何變快? 由於更容易計算內存地址或其他東西? 也有任何功能對齊? /Kanu__ – 2010-05-17 06:03:48

+0

嗯,這取決於你的架構。例如,如果你有一個32位體系結構,並且你的內存只能以4個字節訪問4個地址倍數(4個字節對齊),那麼將它的4個字節數據(例如:整數) 。如果它不對齊,它將允許您在一次內存讀取中訪問它,而不是兩次。 (注意:這種情況是假設的) – Phong 2010-05-17 06:22:29

+0

通常你的編譯器會執行所有的優化,所以你不必管理它。在一些非常特殊的情況下,您可能需要自己指定它(例如:Cell處理器或您的項目硬件)。如果您正在致力於傳統架構,那麼您確實不需要這樣做。 – Phong 2010-05-17 06:24:58

8

內存對齊對於不同方式的性能很重要。它有一個硬件相關的原因。自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小時內給出另一個理由。

+0

謝謝。 好的。 我在等你的第二個理由。 – 2010-05-19 04:32:49

+0

對不起,忘記了。沒有第二個原因。在我寫這篇文章的那一刻,我想到了數組元素的大小和數組,這並不完全是對齊的。但是大小爲2的冪,具有易於計算的優點。某些CPU甚至有地址模式,可以直接乘以2,4或8,而不會受到懲罰(例如x86和68020)。但如前所述,它與對齊無關。 – 2010-05-19 13:03:11

+0

。謝謝(你的)信息。 /renjith_g – 2010-05-19 13:12:07

0

如果內存數據是8字節對齊,則表示:
sizeof(the_data) % 8 == 0。一般用C語言編寫,如果一個結構被建議爲8字節對齊,其大小必須乘以8,如果不是,手動或編譯器需要填充。一些編譯器提供指令來使結構與n字節對齊,對於VC,它是#prgama pack(8),對於gcc,它是__attribute__((aligned(8)))

+0

所以我們可以說一個人正在處理浮點(單一)數據上的SSE(128位)。然而數據長度是38.該過程將數據乘以常數。開發人員應該如何處理這個問題? – Royi 2016-07-19 05:58:19