打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
bss段和.data段的区别

【例一】

cl编译两个小程序如下:

程序1:

int ar[30000];
void main()
{
    ......
}


程序2:

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


发现程序2编译之后所得的.exe文件比程序1的要大得多。当下甚为不解,于是手工编译了一下,并使用了/FAs编译选项来查看了一下其各自的.asm,发现在程序1.asmar的定义如下:

_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却需要占用,其内容由程序初始化,因此造成了上述情况。

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
.BSS(二进制文件术语)
BSS段、数据段、代码段、堆与栈
程序中的数据在内存中的布局
程序分text, data (initialized), bss, stack, heap几个段 - C Language Syntax - 木瓜老C
#pragma DATA_SECTION 和CMD文件
BSS段、数据段和代码段
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服