《C++回顾笔记》进程的内存空间分配
  现代操作系统会为每个进程都分配一个虚拟内存地址空间,虚拟内存技术
使得每个进程都可以独占整个内存空间,地址从零开始,直到内存上限。进程会把整个地址空间(从低地址到高地址)
分为不同的区间用于不同的用途:
  如上图所示,一般来讲,进程会将其虚拟内存地址空间分为六个部分,它们的用途分别如下:
- TEXT段(代码段):代码段用来存放程序执行代码和
所有常量
的区域。代码段的大小在程序运行前
就已经确定,是固定大小且只读的区域(这也是为什么常量不允许修改的原因)
。 - DATA段,又称GVAR段(数据段):数据段通常是指用来存放程序中
已初始化的全局变量和静态变量
的一块内存区域。DATA段的内存属于静态内存分配
。 - BSS段(Block Started by Symbol):BSS段通常用来存放程序中
未初始化的全局变量和静态变量
的一块内存区域,这个区域的内存属于静态内存分配
。BSS段的内存属于静态内存分配
。 - HEAP(堆空间):堆空间是用于存放进程运行中被
动态分配
的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc
或者new
等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free
或者delete
等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。堆空间的内存属于动态内存分配
。 - Unused Memory(未使用的内存):处于堆空间和栈空间中间的、未被使用的区域。堆空间和栈空间的大小是可变的,堆空间从下往上增长,栈空间从上往下增长。堆空间和栈空间增长的时候会消耗未使用的内存区域,直至其被耗尽为止。
- STACK(栈空间):栈空间用于存放函数的参数、返回值和函数体内定义的局部变量。在函数被调用时,其参数和函数体内定义的局部变量会被压入栈空间中。等到函数调用结束后,函数的返回值会被存放回栈中,且被压入栈中的参数和局部变量也会依次出栈。栈空间的内存属于
自动内存分配
。
值得注意的是:
DATA段
和BSS段
的区别在于,如果一个全局变量(或者静态变量)在定义后没有被初始化,那么它会被存在BSS段,一旦该全局变量(或者静态变量)被初始化,那么它就会被存到DATA段。BSS段的字节值全为0
,因为未初始化的全局变量和静态变量都会被在BSS段中,所以可以认为它们都会被默认初始化为0(包括类的成员变量)- HEAP和STACK这两个区域的字节值不一定为0,所以对于存在这个区域的变量来说,如果不对它们进行初始化,那么它们将会得到一个
不确定的值(变量所处内存的残留值)
。
《C++回顾笔记》进程的内存空间分配
https://asancai.github.io/posts/d1a4ed0e/