→ QQ29:V大說的binary就exe嚕? 那到底是global還是全部變數給初值都 01/20 02:01
→ QQ29:會有影響呢? 感覺全部都會有耶 01/20 02:01
做了一個簡單的實驗:
試著把一個 int array 放在不同的地方,並且嘗試是否給予初始值
在編譯後,以 objdump 觀察 ELF section (text, data, bss) 的大小改變
==== 程式碼 ====
#include <stdio.h>
(1)int arr[1024];
(2)int arr[1024] = {1, 2, 3, 4, 5};
int main()
{
(3)int arr[1024];
(4)int arr[1024] = {1, 2, 3, 4, 5};
}
==== 測試環境 ====
OS : Linux Ubuntu 9.04 + gcc 4.3.3
編譯參數:gcc test.c
結果觀察:objdump -x a.out
==== 測試結果 ====
text data bss 執行檔大小 (以 ls -al a.out 得到,十進位,單位 byte)
(0) 0x16C 0x08 0x08 9112 (沒有宣告任何變數,對照組)
(1) 0x16C 0x08 0x1020 9132 (未給初值的 global int[] )
(2) 0x16C 0x1020 0x08 13276 (有給初值的 global int[] )
(3) 0x17C 0x08 0x08 9112 (未給初值的 local int[] )
(4) 0x1EC 0x08 0x08 9112 (有給初值的 local int[] )
(註:local static variable 的結果與 global variable 相同)
==== 結論 ====
1. 未給初值的 global variable 會增加 bss section
2. 有給初值的 global variable 會增加 data section
3. 未給初值的 local variable 似乎不會佔用任何額外空間 (對執行檔來說)
4. 有給初值的 local variable 會增加 text section
想必是用來初始化的額外程式碼,但卻不會增加執行檔的大小
5. 如果陣列的初始值為 {0},則與 2. 相同
6. 陣列的初始值數量增減(譬如改成 {1, 2, 3, 4, 5, 6, 7} 或 {1})
會影響 local variable 的 text section 大小,但 global 則沒有影響
--
※ 發信站: 批踢踢實業坊(ptt.cc)
◆ From: 59.127.184.214
推 csihcs:(3) 0x17C 0x08 0x08 9112 (未給初值的 local in 01/20 04:48
→ csihcs: ^^^^^ 跟上面的 0x16C 有點不一樣喔QQ" 01/20 04:49
因為它真的改變了 XD 我也不知道為什麼...
※ 編輯: james732 來自: 59.127.184.214 (01/20 04:58)
※ 編輯: james732 來自: 59.127.184.214 (01/20 06:05)
→ LPH66:我猜是將 sp 移開做出 local variable 空間的程式... 01/20 06:53
→ LPH66:(喔我是說 0x16C 和 0x17C 的差別) 01/20 06:53
→ LPH66:(記得好像 objdump 可以 dump 出 assembly 出來?) 01/20 06:53
推 VictorTom:(4) 的結果出乎小弟的意料說, 有空測試研究一下好了orz 01/20 10:01
推 VictorTom:剛用VC試了一下, local的init是在執行時直接一個一個用 01/20 10:06
→ VictorTom:mov inst.搬的, 所以只給{1, 2, 3, 4, 5}的情況下只需要 01/20 10:07
→ VictorTom:多5條inst. 多給些初值binary就會變大了; 只是和global 01/20 10:08
→ VictorTom:增加size的地方不太一樣就是了XD 01/20 10:08
推 QQ29:V大 vc怎麼看 組語阿?? 01/20 13:28
→ james732:可以在編譯時輸出組合語言檔 或者用反組譯工具 01/20 13:35
→ james732:Linux 下 gcc -S 可輸出組語檔 而 objdump 可反組譯 01/20 13:37
→ QQ29:是在project property那邊設定嗎@@ 會的太少了... 01/20 13:39
推 VictorTom:VC拉組語看很簡單, break point斷下來, Debug->Windows 01/20 13:46
→ VictorTom:裡就有Disasm的選項可以拉出來看了:) 01/20 13:46
→ VictorTom:j大動作好快XD PS. 這是偷懶直接掛debug的作法, 程式要 01/20 13:50
→ VictorTom:執行起來才能用; 要完整的asm code還是要照j大上面說的. 01/20 13:51
推 QQ29:謝謝vj大的資訊= = 謝謝 01/20 13:51
推 QQ29: V大說的跟J大有甚麼不同 我設中斷點看組語照V大說的做阿 01/20 13:53
→ QQ29:什麼是偷懶@@ 還有也可以看到全部不是嗎~ 01/20 13:54
推 VictorTom:我說的就是j大附圖的方式, 這是step by step debug時即 01/20 13:58
→ VictorTom:時看asm用的; 另外有些工具或者編譯選項是直接產生asm 01/20 13:59
→ VictorTom:code出來, 那就不用掛著debugger看了; 只是, 直接K asm 01/20 13:59
→ VictorTom:code可能也不見得比掛debugger看容易就是了....XD 01/20 13:59
推 QQ29:喔喔 那VC沒有選項可以勾起來 順便輸出asm嗎 01/20 14:37
→ james732:應該就是這個了 01/20 14:47