内存中的区域划分
博客简介
本篇博客主要介绍在C程序中的内存区域的划分,内存被分为一些不同的区域,各有不同的功能和特性,下面是区域的分类:
C语言中的区域划分:
- 栈区stack
- 堆区heap
- 静态区static
- 常量区
C++中的区域划分:
- 栈区stack
- 堆区heap
- 全局区/静态区static
- 常量区
- 代码区
内存中的四区:
- 栈区stack
- 堆区heap
- 全局区
- 代码区
各区域的功能特点
栈区stack
- 特点:程序运行时由编译器自动分配,存放函数的参数值,局部变量的值等,程序结束时由编译器自动释放。
- 功能:里面的变量通常是局部变量、函数参数等。由系统的编译器自动的释放,主要用来存放方法中的参数,一些临时的局部变量等,并且方法中的参数一般在操作完后,会由编译器自动的释放掉。
堆区heap
- 特点:用于动态内存分配。一般由程序员手动分配释放(动态内存申请与释放),若程序员不释放,程序结束时可能由操作系统回收
- 功能:主要用来存放我们动态创建的对象、动态的申请的临时空间等。如程序在运行用malloc或new申请任意内存,程序员自己负责在何处用free或delete释放内存。该动态内存的生存期由我们决定。
全局区/静态区static
- 特点:编译器编译时即分配内存,一旦静态区的内存被分配, 静态区的内存直到程序全部结束之后才会被释放
- 此区域上的东西都被全局所共享,可以采取类名.的方式就可以访问到方法,这就是所谓的静态方法,存放到数据区的。const跟非const存储上没区别,只不过是read only的,在以前的C语言中,全局变量又分为初始化的和未初始化的,在C++里面没有这个区分了,他们共同占用同一块内存区。
常量区
- 特点:这是一块比较特殊的存储区,他们里面存放的是常量,不允许修改。
- 功能: 常量字符串存放在这里的, 程序结束后由系统释放。
程序代码区
C++比C多划分的一个区域
- 特点:存放的程序的编译后的可执行代码的区域,也就是存储机器码(二进制代码)区域,CPU执行的机器指令,只读。存放代码(如函数),不允许修改(类似常量存储区),但可以执行(不同于常量存储区)。
- 功能:存放可以直接被CPU运行的二进制代码,指令
自由存储区
自由存储区:自由存储是C++中通过new与delete动态分配和释放对象的抽象概念,自由存储区和堆不是一个概念。一般而言,自由存储区是指CRT(C运行时库)通过malloc,free函数管理的内存。堆特指通过new,delete管理的内存。但是在部分编译器的实现上这两块内存都是同一种管理方式。但是在c++情况下是不区分的。
变量及函数的总结
这部分是介绍不同类型函数和变量的生命周期作用域默认值内存区域以及连接属性的特点,引自博客:Jacky_Feng
生命周期 | 作用域 | 默认值 | 内存区域 | 链接属性 | |
普通全局变量 |
进程(程序)运行开始创建 进程(程序)结束才销毁 |
从定义开始直到文件末尾 |
0 | 全局(静态)变量区 | 外部的 |
静态全局变量 |
进程(程序)运行开始创建 进程(程序)结束才销毁 |
从定义开始直到文件末尾 |
0 | 全局(静态)变量区 | 内部的 |
普通局部变量 |
进入本函数时创建, 函数退出时销毁 |
函数内部有效 | 随机值 | 栈 |
|
静态局部变量 |
进入本函数时创建, 进程结束才销毁 |
函数内部有效 | 0 | 全局(静态)变量区 |
|
动态内存 |
调用动态内存创建函数时 创建,调用释放函数时销毁 |
|
随机值 | 堆 |
|
普通函数 |
|
|
|
代码区 | 外部的 |
静态函数 |
|
|
|
代码区 | 内部的 |
参考资料: