C 和 C++ 语言相比于其他高级编程语言,一个很明显的优势就是,可以直接控制内存管理,执行效率更高。

所以啊,面试过程中已经多次被问到了关于内存中几大区域的问题,比如内存分为几个区域,哪些区域是存放哪些数据等等。

没有好好下功夫学习过这部分的我直接给问懵了。赶紧偷偷来复习一下。

 内存一共分为 5 个区域,分别是:堆区,栈区,静态区,常量区,和代码区。

先来看一下内存中 5 大区域的对比表。

内存区域存放内容分配和释放
栈区存放函数的参数值,局部变量等由编译器自动分配和释放
堆区动态内存分配得到的内存空间就是位于堆区

由程序员主动分配和释放。

若程序员未主动释放,则程序结束后自动释放

全局区(静态区)存放全局变量和静态变量程序结束后自动释放
常量区存放字符串常量程序结束后自动释放
代码区存放程序的二进制代码/

1. 栈区

由编译器自动分配和释放,存放着函数的参数值和局部变量。

栈区是系统数据结构,对应进程/线程是唯一的,优点是快速高效,缺点是有限制,数据不灵活。

2. 堆区

由程序员手动进行分配和释放,使用 malloc,calloc,realloc 以及 new 得到的内存空间都是位于堆区的。

优点是灵活方便,数据适应面广泛,缺点是效率不高,堆空间的分配是动态的,不同堆分配的内存无法互相操作。

3. 全局区(静态区)

存储全局变量和静态变量,程序结束后由系统统一释放。

全局变量和静态变量,初始化的存放在一个区域,未初始化的存放在另一个区域。

4. 常量区

存放常量字符串,程序结束后由系统统一释放。

5. 代码区

存放程序的二进制代码


  • 代码区,就是存放二进制代码的,没啥好说的;

常量区和全局区(静态区)也很直观,一目了然。

  • “abcdf” 这样的字符串常量,就在常量区;
  • 在函数外定义的全局变量,或者用 static 修饰的静态变量,都存在全局区(静态区)。

比较麻烦的就是堆区和栈区。简单点记就是,

  • 堆区是程序员管理的,可以手动分配和释放空间的,比如 malloc 和 new 等这些操作的都是堆区的空间。
  • 栈区是系统管理的,存放函数的参数和局部变量。一般来讲,不用程序员操心的基本都是在栈区,比如函数的递归调用,函数调用时的形参和实参,函数的返回值,函数的地址等等。