函數參數記憶體位址問題 |
答題得分者是:pcboy
|
yshihyu
一般會員 發表:23 回覆:18 積分:8 註冊:2006-11-28 發送簡訊給我 |
<textarea class="cpp" rows="10" cols="60" name="code">#include
test() 函數內 a , b 變數位址為什麼我測試出來是相差4 byte? , 為什麼不是相差1 byte? 參數記憶體位址不是連續擺放? gcc & vc 測試都是相差4byte 謝謝 編輯記錄
yshihyu 重新編輯於 2007-08-17 06:06:42, 註解 無‧
|
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
|
暗黑破壞神
版主 發表:9 回覆:2301 積分:1627 註冊:2004-10-04 發送簡訊給我 |
http://delphi.ktop.com.tw/board.php?cid=168&fid=912&tid=70130
看一下之前的討論吧。 ===================引 用 yshihyu 文 章=================== <textarea name="code" cols="60" rows="10" class="cpp">#include test() 函數內 a , b 變數位址為什麼我測試出來是相差4 byte? , 為什麼不是相差1 byte? 參數記憶體位址不是連續擺放? gcc & vc 測試都是相差4byte 謝謝 |
pcboy
版主 發表:177 回覆:1838 積分:1463 註冊:2004-01-13 發送簡訊給我 |
省得自己keyin一堆解釋, 去找了一篇給您看 --------------------------------------------------- 什麼是 memory aligment? 對一個 16位元的系統來說,意味著,系統有16條data bus,各能存取一個 bit資料。 16位元當然就是2bytes,正如我們2個一數,數數會是2,4,6,8一樣,address 也不會(也不需要)出現奇數位置1,3,5,7... 現在來看看硬體存取一個byte在奇偶數地址的情況: 1. 要取偶數位置E時,會抓到 (E,E 1)一個WORD(因為data bus是16bits), 因為E是在Lo Byte 所以硬體只要把 Hi Bytes 拋棄掉就成了。 2. 要取奇數位置O時,會抓到 (O-1,O)一個WORD(因為data bus 是16bits), 因為O是在Hi Byte 所以硬體得要把 Hi Bytes 搬到 Lo Bytes 才能算完成存取。 看到奇數地址存取會比偶數地址麻煩了嗎?差一點點而已有什麼關係? 好吧!我們再來看看硬體存取一個WORD在奇偶數地址的情況: 3. 要取偶數位置(E,E 1)時,會抓到 (E,E 1)一個WORD,這樣就完成 存取了。 4. 要取奇數位置(O,O 1)時,要先抓到 (O-1,O)取得Lo Byte O,然後 再抓(O,O 1)得到 Hi Byte(O 1),最後合併(O,O 1)才算完成一個奇數 位址WORD的存取。 比較一下3,4,你就不會說只差一點點了吧!? 在32位元和64位元的系統,可以類推。這也是為什麼很多編譯器會預設 把變數位置調整在 2/4/8 倍數上來得到較佳的存取效率。 但這樣做會使像結構的資料大小意外的變化,若是某個結構的大小是很重要 的,你就必需找出編譯器相關的設定或directive(如VC的pack)來控制 aligment。 http://ehome.hifly.to/showthread.php?postid=2288#post2288
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案! 子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
編輯記錄
pcboy 重新編輯於 2007-08-17 10:13:17, 註解 無‧
|
本站聲明 |
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。 2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。 3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇! |