全國最多中醫師線上諮詢網站-台灣中醫網
發文 回覆 瀏覽次數:1665
推到 Plurk!
推到 Facebook!

偶數記憶體位址

答題得分者是:dllee
yshihyu
一般會員


發表:23
回覆:18
積分:8
註冊:2006-11-28

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-06-08 19:42:40 IP:59.104.xxx.xxx 訂閱
我看書上說整數在記憶體中位址是從偶數位址開始
這樣對於CPU只需要1次存取記憶體即可 , 如果地址是奇數開始CPU 需要2次存取記憶體

有兩個問題想請問

1, 浮點數型態也是從偶數位址開始存取會比較有效率嗎?

2. 為什麼整數從偶數位址開始存取快 , 奇數比較嗎? 可以解釋一下嗎? 這好像是計算機組織的東西因為那時候沒學好 @@

謝謝

編輯記錄
yshihyu 重新編輯於 2007-06-10 21:36:29, 註解 無‧
dllee
站務副站長


發表:321
回覆:2519
積分:1711
註冊:2002-04-15

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-06-08 22:30:08 IP:59.105.xxx.xxx 訂閱
簡單說,假設有一 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

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-06-08 22:55:02 IP:59.104.xxx.xxx 訂閱

===================引 用 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

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-06-08 23:31:22 IP:59.105.xxx.xxx 訂閱
不會吧....
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

發送簡訊給我
#5 引用回覆 回覆 發表時間:2007-06-08 23:36:43 IP:125.231.xxx.xxx 未訂閱
一個 short 兩個 byte
如果位置是 0,1,2,3
是可以放兩個 short
那在抓時也可以一次一個 0,1, 一次 2,3 就抓兩個 short 了。
不過你要是把資料放在 1,2 這兩個 byte 上。
那就要抓一次 0,1 再把 0 去掉, 抓一次 2,3, 再把3去掉。
然後 1,2 合併才是你要的 short 的資料。
這樣會不會比較累?
用你的腦子想想。如果你被限制了。你要怎麼處理。
然後就會發現原來速度變慢是因為這樣。。。。。。
系統時間:2024-03-29 13:29:43
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!