2014-07-24 12 views

回答

2

使用未對齊的內存幾乎總是一個壞主意,不是隻有當它是明確不允許的。即使它不會導致錯誤,如果內存訪問跨越緩存行邊界,並且在其他情況下(請參閱託尼D的評論),它會比如果它沒有。只需使用返回對齊地址的內存池即可。

您可以通過分配大塊字節new並將其分成給定數量的4,8,16 ...字節塊並返回最小擬合來製作簡單對齊的內存池。您可以使用位圖來跟蹤哪些塊被分配。我應該說這是低效的。我認爲這是更多的樂趣/學習比生產或你只會使用new。編寫你自己的分配器並不容易,你可以看看malloc的實現來了解我的意思。速度,空間效率和碎片之間的平衡很難實現。

+1

+1地段好點,但對於「時,它不會導致錯誤,如果內存訪問跨過高速緩存行」 - 這不只是高速緩存行邊界......即使未對齊的訪問是一個緩存中行可以是通常速度的一小部分,而他們編排整個單詞的操作。例如,從地址1,2,3,5,6,7等讀取一個32位'int'。 –

+0

你可以創建一個簡單對齊的內存池,方法是分配一大塊新的字節並將其分解爲給定數量的4,8,16 ...字節塊並返回最小擬合。如果CPU需要8字節對齊的內存boundries,是不明智的。當你分配從'塊new'它已經對準返回doesnt't比賽 – JoeyMiu

+0

一個內存地址,當你打破它像我形容,對準被保留。所以如果你返回一個8字節的塊,它將會被8字節對齊。 – Tyler