線上訂房服務-台灣趴趴狗聯合訂房中心
發文 回覆 瀏覽次數:1753
推到 Plurk!
推到 Facebook!

函數參數記憶體位址問題

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


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

發送簡訊給我
#1 引用回覆 回覆 發表時間:2007-08-17 06:05:53 IP:203.70.xxx.xxx 訂閱
<textarea class="cpp" rows="10" cols="60" name="code">#include void test(char,char); int main(int argc, char *argv[]) { test('a','b'); return 0; } void test(char a,char b) { printf("%p\n",&a); printf("%p\n",&b); }</textarea><br />

test() 函數內 a , b 變數位址為什麼我測試出來是相差4 byte? , 為什麼不是相差1 byte?
參數記憶體位址不是連續擺放?
gcc & vc 測試都是相差4byte

謝謝
編輯記錄
yshihyu 重新編輯於 2007-08-17 06:06:42, 註解 無‧
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#2 引用回覆 回覆 發表時間:2007-08-17 08:21:25 IP:61.220.xxx.xxx 訂閱
印象中32bit電腦, 在為了存取資料快速的情況下, 資料存放的位址會放在 4 bytes 倍數的地方 (浪費一點空間換取速度)
如果是64bit, 資料存放的位址會放在 8 bytes 倍數的地方

這並非絕對需要如此, Compiler選項找找, 可能有程式大小最小化的選項, 可能就是相鄰1 byte存放
PS: 如有錯誤歡迎指正
------
能力不足,求助於人;有能力時,幫幫別人;如果您滿意答覆,請適時結案!

子曰:問有三種,不懂則問,雖懂有疑則問,雖懂而想知更多則問!
暗黑破壞神
版主


發表:9
回覆:2301
積分:1627
註冊:2004-10-04

發送簡訊給我
#3 引用回覆 回覆 發表時間:2007-08-17 09:28:45 IP:211.77.xxx.xxx 未訂閱
http://delphi.ktop.com.tw/board.php?cid=168&fid=912&tid=70130

看一下之前的討論吧。

===================引 用 yshihyu 文 章===================
<textarea name="code" cols="60" rows="10" class="cpp">#include void test(char,char); int main(int argc, char *argv[]) { test('a','b'); return 0; } void test(char a,char b) { printf("%p\n",&a); printf("%p\n",&b); }</textarea><br />

test() 函數內 a , b 變數位址為什麼我測試出來是相差4 byte? , 為什麼不是相差1 byte?
參數記憶體位址不是連續擺放?
gcc & vc 測試都是相差4byte

謝謝
pcboy
版主


發表:177
回覆:1838
積分:1463
註冊:2004-01-13

發送簡訊給我
#4 引用回覆 回覆 發表時間:2007-08-17 09:44:30 IP:61.220.xxx.xxx 訂閱
省得自己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, 註解 無‧
系統時間:2024-05-02 15:11:04
聯絡我們 | Delphi K.Top討論版
本站聲明
1. 本論壇為無營利行為之開放平台,所有文章都是由網友自行張貼,如牽涉到法律糾紛一切與本站無關。
2. 假如網友發表之內容涉及侵權,而損及您的利益,請立即通知版主刪除。
3. 請勿批評中華民國元首及政府或批評各政黨,是藍是綠本站無權干涉,但這裡不是政治性論壇!