zoukankan      html  css  js  c++  java
  • 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却需要占用,其内容由程序初始化,因此造成了上述情况。

  • 相关阅读:
    十天冲刺4
    单词统计
    十天冲刺3
    学习进度第十周
    十天冲刺2
    十天冲刺1
    梦断代码阅读笔记03
    学习进度第九周
    [强网杯 2019]Upload
    [2020 新春红包题]1
  • 原文地址:https://www.cnblogs.com/cutepig/p/936225.html
Copyright © 2011-2022 走看看