程序1:
int?ar[30000];
void?main()

{
????......
} 程序2:

int?ar[300000]?=?
{1,?2,?3,?4,?5,?6?};
void?main()

{
????......
} 發現程序2編譯之后所得的.exe文件比程序1的要大得多。當下甚為不解,于是手工編譯了一下,并使用了/FAs編譯選項來查看了一下其各自的.asm,發現在程序1.asm中ar的定義如下:
_BSS?SEGMENT
??????ar@@3PAHA?DD?0493e0H?DUP?(?)????;?ar
_BSS?ENDS 而在程序2.asm中,ar被定義為:
_DATA?SEGMENT
??????ar@@3PAHA?DD?01H?????;?ar
????????????????DD?02H
????????????????DD?03H
????????????????ORG?$+1199988
_DATA?ENDS 區別很明顯,一個位于.bss段,而另一個位于.data段,兩者的區別在于:全局的未初始化變量存在于.bss段中,具體體現為一個占位符;全局的已初始化變量存于.data段中;而函數內的自動變量都在棧上分配空間。.bss是不占用.exe文件空間的,其內容由操作系統初始化(清零);而.data卻需要占用,其內容由程序初始化,因此造成了上述情況。
相關參考: http://www.linuxsir.org/bbs/showthread.php?t=204807


