内存分配的类型
在C / C++
中内存分为五个区:
- 栈区
- 堆区
- 全局/静态存储区
- 常量存储区
- 代码区
内存的分配有静态和动态之分:
- 静态内存分配:编译时分配。
全局变量、静态全局变量、静态局部变量。
- 动态内存分配:运行时分配。
局部变量、存放在程序员手动
malloc
出的堆区空间中的变量。
变量的内存分配
栈区 [stack
]:编译器在需要的时候分配,不需要时自动清除的变量所在的储存区。
如函数执行时,函数的形参以及函数内的局部变量分配在栈区。
函数运行结束后,形参和局部变量去栈
(自动释放)。
栈内存分配运算内置与处理器的指令集中,效率高但是分配的内存空间有限。
堆区 [heap
]:由程序员手动分配释放的储存区。
如果程序员不释放这块内存,内存将一直被占用,直到程序运行结束由系统自动收回。
C语言中使用malloc
free
申请和释放空间。
静态储存区 [static
]:初始化的全局变量和静态变量存储在该区域。
全局变量和静态变量的储存是放在一块的。
这块空间当程序运行结束后由系统释放。
常量储存区 [const
]:常量字符串与const
修饰的全局变量储存在常量区。
"ABC"
字符串就储存在常量区,储存在常量区的只读不可写。
const
修饰的局部变量依然在栈上。
程序代码区:存放源程序的二进制代码。
总结
变量
变量 | 分配时机 | 内存区 |
---|---|---|
局部变量 | 运行时 | 栈区 |
程序员手动malloc 的堆区空间 | 运行时 | 堆区 |
全局变量 | 编译时 | 静态存储区 |
静态全局变量 | 编译时 | 静态存储区 |
静态局部变量 | 编译时 | 静态存储区 |
常量
常量 | 内存区 |
---|---|
常量字符串 | 常量存储区 |
const 修饰的全局变量 | 常量存储区 |
const 修饰的局部变量 | 栈区 |