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

  • 相关阅读:
    quick cocos naja
    quick cocos sprite 3 zhongfangshi
    quick cocos moveto
    quick cocos animate2
    quick cocos animate
    quick cocos schedule
    quick cocos scheduler update
    【leetcode】括号的最大嵌套深度
    【leetcode】删除某些元素后的数组均值
    【leetcode】二叉树的最小深度
  • 原文地址:https://www.cnblogs.com/cutepig/p/936225.html
Copyright © 2020-2023  润新知