进程空间的内存分配
从高地址到低地址如图所示:
| 名称 | |
|---|---|
| 操作系统内核区 | 用户不可见 |
| 用户栈 | 栈指针,向下扩展 |
| 动态堆 | 向上扩展 |
| 全局区(静态区) | .data初始化.bss未初始化 |
| 文字常量区(只读数据) | 常量字符串 |
| 程序代码区 | 栈指针,向下扩展 |
下面详细介绍这几个区域:
1.栈区:
- 由编译器自动分配释放,速度较快
- 程序在编译期对变量,返回地址,参数和函数分配内存都在栈上进行,函数运行结束,这些局部变量等空间都会被释放
- 程序运行过程中函数调用时参数的传递也在栈上进行,如递归调用栈
- 当栈过多的时候,就是导致栈溢出(比如大量的递归调用或者大量的内存分配)
- 栈是向低地址扩展的数据结构,是一块连续的内存的区域,空间有限
2. 堆区:
- 由程序员分配(new,malloc)释放(delete,free),并指明大小,速度较慢
- 若程序员不释放,导致内存泄漏,new完没有delete
- 不过在整个程序结束时由操作系统回收,但是这样无疑增加了操作系统的负担
- 高地址扩展的数据结构,是不连续的内存区域,空间很

本文详细介绍了进程空间的内存分配,包括栈区、堆区、全局区、文字常量区和程序代码区。栈区由编译器自动分配释放,速度较快,但易发生栈溢出;堆区由程序员分配释放,速度较慢,可能导致内存泄漏。此外,文章讨论了函数调用栈、递归调用的影响以及递归的缺点。
1833

被折叠的 条评论
为什么被折叠?



