2
CPU and Data alignment 在這個問題上,晏拉敏說一些CPU(ARM或Intel SSE指令)要求對齊的內存和做未對齊的訪問時都未定義操作(或拋出異常)。如果我使用了不能處理這種情況的內存池,它會使我的應用程序變得更糟嗎?對於需要對齊內存的cpu使用內存池是個好主意嗎?
CPU and Data alignment 在這個問題上,晏拉敏說一些CPU(ARM或Intel SSE指令)要求對齊的內存和做未對齊的訪問時都未定義操作(或拋出異常)。如果我使用了不能處理這種情況的內存池,它會使我的應用程序變得更糟嗎?對於需要對齊內存的cpu使用內存池是個好主意嗎?
使用未對齊的內存幾乎總是一個壞主意,不是隻有當它是明確不允許的。即使它不會導致錯誤,如果內存訪問跨越緩存行邊界,並且在其他情況下(請參閱託尼D的評論),它會比如果它沒有。只需使用返回對齊地址的內存池即可。
您可以通過分配大塊字節new
並將其分成給定數量的4,8,16 ...字節塊並返回最小擬合來製作簡單對齊的內存池。您可以使用位圖來跟蹤哪些塊被分配。我應該說這是低效的。我認爲這是更多的樂趣/學習比生產或你只會使用new
。編寫你自己的分配器並不容易,你可以看看malloc
的實現來了解我的意思。速度,空間效率和碎片之間的平衡很難實現。
+1地段好點,但對於「時,它不會導致錯誤,如果內存訪問跨過高速緩存行」 - 這不只是高速緩存行邊界......即使未對齊的訪問是一個緩存中行可以是通常速度的一小部分,而他們編排整個單詞的操作。例如,從地址1,2,3,5,6,7等讀取一個32位'int'。 –
你可以創建一個簡單對齊的內存池,方法是分配一大塊新的字節並將其分解爲給定數量的4,8,16 ...字節塊並返回最小擬合。如果CPU需要8字節對齊的內存boundries,是不明智的。當你分配從'塊new'它已經對準返回doesnt't比賽 – JoeyMiu
一個內存地址,當你打破它像我形容,對準被保留。所以如果你返回一個8字節的塊,它將會被8字節對齊。 – Tyler