[心得] 關於Memory Alignment消失

看板EE_DSnP作者時間11年前 (2012/10/04 22:30), 編輯推噓4(406)
留言10則, 4人參與, 最新討論串1/1
關於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
CPU其實可以決定要不要只讀1個byte
10/04 22:49, 2F

10/04 22:50, , 3F
比較關鍵的是他故意要把資料存在記憶體4的倍數的地方
10/04 22:50, 3F

10/04 22:51, , 4F
這樣要讀的時候可以少牽兩條線出來
10/04 22:51, 4F

10/04 22:52, , 5F
詳情可以修計算機組織/結構 推一下好課XD
10/04 22:52, 5F

10/04 23:03, , 6F
計結好像正在教haha
10/04 23:03, 6F

10/05 00:22, , 7F
x86/x64 以及其他 CPU 還有一個令人很困擾的地方
10/05 00:22, 7F

10/05 00:22, , 8F
就是 endian byte 的問題
10/05 00:22, 8F

10/05 00:24, , 9F
另外,struct 的 integer 是可以放在 non-align 的
10/05 00:24, 9F

10/05 00:25, , 10F
位置的 (packed),但是通常不會有人這麼作
10/05 00:25, 10F
文章代碼(AID): #1GRPrxiR (EE_DSnP)