BSS 段 : BSS 段 ( bss segment ) 通常是指用来存放程序中未初始化的全局变量的一块内存区
域。 BSS 是英文 Block Started by Symbol 的简称。 BSS 段属于静态内存分配。
数据段:数据段( data segment )通常是指用来存放程序中已初始化的全局变量的一块内存
区域。数据段属于静态内存分配。
代码段 : 代码段 ( code segment/text segment ) 通常是指用来存放程序执行代码的一块内存区
域 。 这部分区域的大小在程序运行前就已经确定 , 并且内存区域通常属于只读 , 某些架构也
允许代码段为可写,即允许修改程序。在代码段中,也有可能包含一些只读的常数变量 , 例
如字符串常量等。
堆( heap ) :堆是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩
张或缩减。当进程调用 malloc 等函数分配内存时,新分配的内存就被动态添加到堆上(堆
被扩张 ) ;当利用 free 等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)
栈 (stack) : 栈又称堆栈 , 是用户存放程序临时创建的局部变量 , 也就是说我们函数括弧 “ {} ”
中定义的变量 ( 但不包括 static 声明的变量 , static 意味着在数据段中存放变量 ) 。 除此以外
,
在函数被调用时 , 其参数也会被压入发起调用的进程栈中 , 并且待到调用结束后 , 函数的返
回值也会被存放回栈中 。 由于栈的先进先出特点 , 所以栈特别方便用来保存 / 恢复调用现场
。
从这个意义上讲,我们可以把堆栈看成一个寄存、交换临时数据的内存区。
【例一】
用 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.asm 中 ar 的定义
如下: