關於讀者 Mr.K 的第三封來信

> "真正"配置變數記憶體位址的時候 我覺得是在runtime時(程式載入記憶體後) 而不是編譯後產生的o或連結後的執行檔 不曉得這觀念正確嗎?
> 像int a;沒設初值會RESB 1,那要是整個程式裡都沒使用a,這樣是否就浪費實體記憶體某段4bytes空間?
>
> 如果struct st{
> inta;
> intb;
> };
> struct st s;
> 這樣s有無佔記憶體空間?
>

s 會佔記憶體空間,如果 s 是全域或 static 變數,會放在 .bss 段,如果是函數中的區域變數,則會被放入堆疊段。如果有一些初始值,則這些初始值會被放在 .sdata 段 (靜態資料段).



不是很清楚
所以區域變數未設初始值是在.bss?還是在.stack?
像int a;沒設初值會RESB 1,那整個程式裡都沒使用a的話,是會浪費實體記憶體某段4bytes空間嗎?
"真正"配置變數記憶體位址的時候 我覺得是在runtime時(程式載入記憶體後) 還是是編譯後產生的o或連結後的執行檔?

舉例而言,以下的兩種宣告方式,會有不同的結果:

int a = 10;

int f() {
int x = 5;

}

a=10 轉換成組合語言時,會變成

.data
a: WORD 10

但是 int x=5 由於是區域變數,因此會在程式進入函數 f 時,將變數保存在堆疊當中,這樣才能容許像遞迴的呼叫方式,此時編譯器不會編譯出 x 這樣的變數名稱,而是以像 [fp+4] 這樣的定址方式,以相對於框架暫存器的方式存取變數 x,如此才能允許不同層次的遞迴存取不同層次的區域變數。

有關框架暫存器的存取方式可以參考 7-20~25 頁(範例 7.1, 7.2,
圖 7.17、圖 7.18),以及8-28 頁 (範例 8.9) 等頁的內容。

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License