C 和 C++ 语言相比于其他高级编程语言,一个很明显的优势就是,可以直接控制内存管理,执行效率更高。
所以啊,面试过程中已经多次被问到了关于内存中几大区域的问题,比如内存分为几个区域,哪些区域是存放哪些数据等等。
没有好好下功夫学习过这部分的我直接给问懵了。赶紧偷偷来复习一下。
内存一共分为 5 个区域,分别是:堆区,栈区,静态区,常量区,和代码区。
先来看一下内存中 5 大区域的对比表。
内存区域 | 存放内容 | 分配和释放 |
---|---|---|
栈区 | 存放函数的参数值,局部变量等 | 由编译器自动分配和释放 |
堆区 | 动态内存分配得到的内存空间就是位于堆区 | 由程序员主动分配和释放。 若程序员未主动释放,则程序结束后自动释放 |
全局区(静态区) | 存放全局变量和静态变量 | 程序结束后自动释放 |
常量区 | 存放字符串常量 | 程序结束后自动释放 |
代码区 | 存放程序的二进制代码 | / |
1. 栈区
由编译器自动分配和释放,存放着函数的参数值和局部变量。
栈区是系统数据结构,对应进程/线程是唯一的,优点是快速高效,缺点是有限制,数据不灵活。
2. 堆区
由程序员手动进行分配和释放,使用 malloc,calloc,realloc 以及 new 得到的内存空间都是位于堆区的。
优点是灵活方便,数据适应面广泛,缺点是效率不高,堆空间的分配是动态的,不同堆分配的内存无法互相操作。
3. 全局区(静态区)
存储全局变量和静态变量,程序结束后由系统统一释放。
全局变量和静态变量,初始化的存放在一个区域,未初始化的存放在另一个区域。
4. 常量区
存放常量字符串,程序结束后由系统统一释放。
5. 代码区
存放程序的二进制代码
- 代码区,就是存放二进制代码的,没啥好说的;
常量区和全局区(静态区)也很直观,一目了然。
- “abcdf” 这样的字符串常量,就在常量区;
- 在函数外定义的全局变量,或者用 static 修饰的静态变量,都存在全局区(静态区)。
比较麻烦的就是堆区和栈区。简单点记就是,
- 堆区是程序员管理的,可以手动分配和释放空间的,比如 malloc 和 new 等这些操作的都是堆区的空间。
- 栈区是系统管理的,存放函数的参数和局部变量。一般来讲,不用程序员操心的基本都是在栈区,比如函数的递归调用,函数调用时的形参和实参,函数的返回值,函数的地址等等。