看板 C_and_CPP 關於我們 聯絡資訊
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
james732:http://james732.pixnet.net/album/photo/116245789 補圖 01/20 13:47
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