[問題] 記憶體Alignment access

看板C_and_CPP (C/C++)作者時間13年前 (2012/11/17 21:22), 編輯推噓1(1019)
留言20則, 5人參與, 最新討論串1/1
問題(Question): 最近碰到有關於Alignment的一些觀念問題 這邊舉一個例子好了 如: typedef struct myStruct { char letter; unsigned short num; }; 若在32-bit的環境編譯後myStruct的資料型態會是4-byte 因此其在記憶體中的資料排列會是 +---------------+ 0x00 | letter | +---------------+ 0x01 | num | +-- --+ 0x02 | | +---------------+ |(padding) + +---------------+ | | ...... 那對於32-bit處理器在做存取時 假設0x00為其基底好了 如果是要取letter的話, 記憶體位移量會是0x00 所以直接對0x00定址後取4-byte出來 那之後再取num的話 處理器在做記憶體存取時 需要再改變其位移量嗎(0x01) 還是說同樣對0x00取整個4-byte進處理器?? 謝謝!! -- ※ 發信站: 批踢踢實業坊(ptt.cc) ◆ From: 118.166.59.10 ※ 編輯: cywec 來自: 118.166.59.10 (11/17 21:23)

11/17 21:26, , 1F
x86有16-bit size的reigster, 然後memory to cache的大
11/17 21:26, 1F

11/17 21:26, , 2F
小是cache-block (64B or 128B) XD
11/17 21:26, 2F

11/17 21:27, , 3F
還是說你的問題是要問 他從cache block拿出來到register
11/17 21:27, 3F

11/17 21:28, , 4F
的時候會先丟到full-width的register (例如eax或rax)
11/17 21:28, 4F

11/17 21:28, , 5F
然後再做一些複雜的繞線讓他移到ax~嗎?
11/17 21:28, 5F

11/17 21:28, , 6F
好啦如果你不是講x86請不要理我QQ
11/17 21:28, 6F

11/17 21:29, , 7F
可是對於32-bit的指令執行在32-bit的環境, 會用到16-bit
11/17 21:29, 7F

11/17 21:29, , 8F
的register嗎?
11/17 21:29, 8F

11/17 21:29, , 9F
我只是想問說他從memory到cache這塊的取法
11/17 21:29, 9F

11/17 21:30, , 10F
因為32-bit的處理器不可能傻傻的為了1-byte只取1-byte吧
11/17 21:30, 10F

11/17 22:36, , 11F
何不問問編譯器呢?
11/17 22:36, 11F

11/17 23:21, , 12F
所以問題無解嗎@@" 我只是想知道一下大部份的做法
11/17 23:21, 12F

11/17 23:31, , 13F
Lovme00835是正解
11/17 23:31, 13F

11/17 23:35, , 14F
我之前看過的反組譯都是"傻傻的去讀記憶體兩次"為主
11/17 23:35, 14F

11/17 23:40, , 15F
如果是cache的行為的話,cpu就只接跟cache拿就好
11/17 23:40, 15F

11/17 23:41, , 16F
只要沒有cache miss,cache就不會再跟mem拿資料
11/17 23:41, 16F

11/18 07:08, , 17F
了解, 那如果說是在第一次取資料的情況, 應該也會將unsigned
11/18 07:08, 17F

11/18 07:10, , 18F
short一併存進快取中提升其cache hit rate?
11/18 07:10, 18F

11/18 12:27, , 19F
cache 一次是存一塊阿,如果為了減少 mem access inst
11/18 12:27, 19F

11/18 12:27, , 20F
反而要多幾道指令來 mask + shift 阿
11/18 12:27, 20F
文章代碼(AID): #1Gfu-B9h (C_and_CPP)
文章代碼(AID): #1Gfu-B9h (C_and_CPP)