[心得] 關於Memory Alignment消失
關於int型別為何只能從從記憶體為4的倍數的位置開始儲存,
為什麼每個型別只能從自己型別大小的倍數的記憶體位址開
始儲存?
首先,CPU讀取記憶體時是由CPU的bus來決定讀取的bits數目,
32bits的CPU一次能讀取32個bits,而64bits的CPU一次能讀取64個
bits,所以一次能讀取的量是固定的,不能這次讀30bits,下次讀
32bits,講到這裡大家應該都了解我要說什麼了,如果沒有
Memory Alignment 也就是資料可以任意存取的話,那麼CPU的讀取
可能會造成資料被截斷。舉個例子讓大家了解
32 bits(4bytes)的例子:
記憶體位置 00 01 02 03 04 05 06 07 08 09 10
資料的存取 f0 74 c9 d7 b8 a4 ca ff fe e5 d8
----------- -----------
int -- int
char
CPU從00開始讀取4個bytes,到03的位置,沒有任何問題讀到了一個
integer,但是在往下讀就會讀到一個Char和一個不完整的int(Orz),
所以CPU可能就得讀兩次才能知道型別,十分沒有效率(一個可以讀
4bytes的CPU得讀兩次才能讀懂一個4bytes的資料,怎麼看都不覺得
是一個好的CPU),所以 Memory Alignment有其存在的必要。
以上是個人看法,有錯的地方請指正,若要砲轟我亂講也請小力點,
謝謝。
--
※ 發信站: 批踢踢實業坊(ptt.cc)
推
10/04 22:48, , 1F
10/04 22:48, 1F
→
10/04 22:49, , 2F
10/04 22:49, 2F
→
10/04 22:50, , 3F
10/04 22:50, 3F
→
10/04 22:51, , 4F
10/04 22:51, 4F
→
10/04 22:52, , 5F
10/04 22:52, 5F
推
10/04 23:03, , 6F
10/04 23:03, 6F
推
10/05 00:22, , 7F
10/05 00:22, 7F
→
10/05 00:22, , 8F
10/05 00:22, 8F
推
10/05 00:24, , 9F
10/05 00:24, 9F
→
10/05 00:25, , 10F
10/05 00:25, 10F