《C++回顾笔记》进程的内存空间分配

  现代操作系统会为每个进程都分配一个虚拟内存地址空间,虚拟内存技术使得每个进程都可以独占整个内存空间,地址从零开始,直到内存上限。进程会把整个地址空间(从低地址到高地址)分为不同的区间用于不同的用途:
进程的内存区间

  如上图所示,一般来讲,进程会将其虚拟内存地址空间分为六个部分,它们的用途分别如下:

  1. TEXT段(代码段):代码段用来存放程序执行代码和所有常量的区域。代码段的大小在程序运行前就已经确定,是固定大小且只读的区域(这也是为什么常量不允许修改的原因)
  2. DATA段,又称GVAR段(数据段):数据段通常是指用来存放程序中已初始化的全局变量和静态变量的一块内存区域。DATA段的内存属于静态内存分配
  3. BSS段(Block Started by Symbol):BSS段通常用来存放程序中未初始化的全局变量和静态变量的一块内存区域,这个区域的内存属于静态内存分配。BSS段的内存属于静态内存分配
  4. HEAP(堆空间):堆空间是用于存放进程运行中被动态分配的内存段,它的大小并不固定,可动态扩张或缩减。当进程调用malloc或者new等函数分配内存时,新分配的内存就被动态添加到堆上(堆被扩张);当利用free或者delete等函数释放内存时,被释放的内存从堆中被剔除(堆被缩减)。堆空间的内存属于动态内存分配
  5. Unused Memory(未使用的内存):处于堆空间和栈空间中间的、未被使用的区域。堆空间和栈空间的大小是可变的,堆空间从下往上增长,栈空间从上往下增长。堆空间和栈空间增长的时候会消耗未使用的内存区域,直至其被耗尽为止。
  6. STACK(栈空间):栈空间用于存放函数的参数、返回值和函数体内定义的局部变量。在函数被调用时,其参数和函数体内定义的局部变量会被压入栈空间中。等到函数调用结束后,函数的返回值会被存放回栈中,且被压入栈中的参数和局部变量也会依次出栈。栈空间的内存属于自动内存分配

值得注意的是:

  • DATA段BSS段的区别在于,如果一个全局变量(或者静态变量)在定义后没有被初始化,那么它会被存在BSS段,一旦该全局变量(或者静态变量)被初始化,那么它就会被存到DATA段。
  • BSS段的字节值全为0,因为未初始化的全局变量和静态变量都会被在BSS段中,所以可以认为它们都会被默认初始化为0(包括类的成员变量)
  • HEAP和STACK这两个区域的字节值不一定为0,所以对于存在这个区域的变量来说,如果不对它们进行初始化,那么它们将会得到一个不确定的值(变量所处内存的残留值)

《C++回顾笔记》进程的内存空间分配
https://asancai.github.io/posts/d1a4ed0e/
作者
RainbowCyan
发布于
2021年4月28日
许可协议