偶數記憶體位址 |
答題得分者是:dllee
|
yshihyu
一般會員 發表:23 回覆:18 積分:8 註冊:2006-11-28 發送簡訊給我 |
|
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
簡單說,假設有一 16 位元的 CPU,16 位元就是 CPU 每次在讀寫外部記憶體時,
每次讀寫是以 16 位元(16/8=2Bytes)為單位。 所以若是記憶體內有 A,B,C 三個變數位址如下: 0x0000 ┐ A short (int 16) 0x0001 ┘ 0x0002 B char 0x0003 ┐ C short (int 16) 0x0004 ┘ 0x0005 那 A 就是讀一次就可以, B 也是讀一次就可以,但 C 就要讀兩次才能得到。 當然,現在 CPU 已 32/64 位元,每次可以讀的更多 Bytes,確實變數位址若在某些位址, 再加上變數型態占多Bytes的話,很可能是要讀兩次才得到。 不過,在 Compiler 中都有選項可以設定 Byte Alignment,而且通常是預設以 Quad word, 也就是避掉所有可能需要讀兩次的狀況,可參考之前的討論: STRUCT 的 問題 http://delphi.ktop.com.tw/board.php?cid=168&fid=912&tid=29399
------
http://www.ViewMove.com |
yshihyu
一般會員 發表:23 回覆:18 積分:8 註冊:2006-11-28 發送簡訊給我 |
===================引 用 dllee 文 章=================== 簡單說,假設有一 16 位元的 CPU,16 位元就是 CPU 每次在讀寫外部記憶體時, 每次讀寫是以 16 位元(16/8=2Bytes)為單位。 所以若是記憶體內有 A,B,C 三個變數位址如下: 0x0000 ┐ A short (int 16) 0x0001 ┘ 0x0002???? B char 0x0003 ┐ C short (int 16) 0x0004 ┘ 0x0005 那 A 就是讀一次就可以, B 也是讀一次就可以,但 C 就要讀兩次才能得到。 當然,現在 CPU 已 32/64 位元,每次可以讀的更多 Bytes,確實變數位址若在某些位址, 再加上變數型態占多Bytes的話,很可能是要讀兩次才得到。 不過,在 Compiler 中都有選項可以設定 Byte Alignment,而且通常是預設以 Quad word, 也就是避掉所有可能需要讀兩次的狀況,可參考之前的討論: STRUCT 的 問題 http://delphi.ktop.com.tw/board.php?cid=168&fid=912&tid=29399 _________________________________________________________________________________________ dllee 謝謝你的解說 16 位元的 CPU,16 位元就是 CPU 每次在讀寫外部記憶體時,每次讀寫是以 16 位元(16/8=2Bytes)為單位。 上面你所說觀念我知道 , 但我還是看不懂記憶體位址在偶數 跟 奇數存取上為什麼會有差異? 謝謝 |
dllee
站務副站長 發表:321 回覆:2519 積分:1711 註冊:2002-04-15 發送簡訊給我 |
不會吧....
0x0000 0x0002 0x0004 ... 這些就是偶數呀,也就是 16 位元 CPU 讀取外部記憶體的起始位置。 同上例, A 就是在 0x0000 偶數位址, 一次可讀/寫完成,而 C 就是由 0x0003 奇數位址,要讀兩次,一次讀 0x0002-0x0003 另一次 讀 0x0004-0x0005,再組成 0x0003-0x0004。 所以在偶數位址只讀一次, 在奇數位址讀兩次(上例),當然,在不同 位元 CPU 及不同資料型態有不同的組合。
------
http://www.ViewMove.com |
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |