操作系统栈和堆
地址空间布局:
栈:
执行期间编译器自动分配,编译器用它实现函数调用,调用函数时,栈增长,函数返回时,栈收缩。局部变量、函数参数、返回数据、返回地址等放在栈中。
栈的特点
- 内存分配取决于编译器,用户栈在程序运行期间可以动态的扩展和收缩。
- 和数据结构中的“栈”本质上是不一样的,但是操作方式类似于栈。
- 数据从栈中的进出满足“后进先出”的规律。
- 栈向低地址方向增长,esp(栈指针)指向栈顶元素。
堆:
动态储存器分配器维护着的一个进程的虚拟存储器区域。一般由程序员分配释放(堆在操作系统对进程初始化的时候分配),若程序员不释放,程序结束时可能由OS回收,每个进程,内核都维护着一个变量brk指向堆顶。
堆的特点
- 内存分配取决于程序员,C/C++可以手动释放该片内存。
- 和数据结构的”堆“完全两回事,没有半点关系,在这里堆的结构更像链表。
- 所有的对象,包括数组的对象都存在堆上。
- 堆内存被所有的线程共享。
- 引用类型总是放在堆中。
- 堆向高地址方向增长,内核都维护的变量brk指向堆顶。
注意:值类型和指针总是放在他们被声明的地方(复杂)
当值类型的数据在方法体内被声明时,它们都应该放在栈上。
如果一个只类型被声明在方法体外且存在于一个引用类型中,那么它将会被堆里的引用类型所取代。
全局区/静态区:
全局变量、静态变量、常量的存储区域,程序终止时系统释放。
文字常量区:
存放常量字符串,程序结束后由系统释放。
程序代码区:
存放函数体(类成员函数和全局函数)的二进制代码。
实例
int a = 0; //全局初始化区
char *p1; //全局未初始化区
void main()
{
int b; //栈
char s[] = "123"; //栈
char *p2; //栈
char *p3 = "sdfghhj"; //其中,“sdfghhj\0”常量区,p3在栈区
static int c = 0; //全局区
p1 = (char*)malloc(10); //10个字节区域在堆区
strcpy(p1,"sdfghhj"); //"sdfghhj\0"在常量区,编译器可能会优化p1和p3指向同一块区域
}
栈和堆的区别:
- 栈内存存储的的是局部变量,堆内存存储的是实体。
- 栈内存的更新的速度会更快些(局部变量),堆内存的更新速度相对更慢。
- 栈内存的访问直接从地址读取数据到寄存器,然后放到目标地址,而堆内存的访问更麻烦,先将分配的地址放到寄存器,在读取地址的值,最后再放到目标文件中,开销更大。
- 栈内存是连续的空间,堆内存一般情况不是连续的,频繁地开辟空间,释放空间容易产生内存碎片(外碎片)。
栈和堆的联系:
堆中对象是直接由栈中的句柄(引用)管理者,所以堆负责产生真实对象,栈负责管理对象。
转载于:https://my.oschina.net/u/4167465/blog/3084518
分享到:
相关推荐
### 操作系统中堆和栈的区别 #### 一、预备知识—程序的内存分配 一个由C/C++编译的程序占用的内存被细分为以下几个关键部分: 1. **栈区(Stack)**:这部分内存是由编译器自动管理的,主要用于存放函数的参数值...
操作系统基本概念——栈、堆、并发、进程 操作系统是计算机系统的核心组件之一,对计算机系统的性能和安全性至关重要。本文对操作系统的一些基本概念进行了介绍,包括栈、堆、系统并发、进程、线程等概念。 1. ...
- **栈**:由操作系统自动分配和回收,通常在函数调用时创建,函数返回时销毁。 - **堆**:由程序员主动控制分配和释放,可以在任何时候请求或释放内存,但需注意避免内存泄漏。 #### 存储内容 - **栈**:主要用于...
堆的大小理论上没有限制,但受到物理内存和操作系统管理的限制。 3. 内存效率:栈的访问速度更快,因为其内存布局连续且管理简单;堆的访问速度相对较慢,因为需要搜索合适的空闲块。 4. 生存期:栈上的变量只在所属...
首先,我们要明白栈和堆的主要区别。栈是一种后进先出(LIFO,Last In First Out)的数据结构,它主要用于存储临时变量、函数调用时的参数、返回地址等。每次函数调用都会在栈上创建一个新的上下文,当函数执行完毕...
在这个主题中,我们将深入探讨JDK的配置、数组的应用以及栈和堆内存的图解,同时通过具体的Java源码来加深理解。 首先,JDK(Java Development Kit)是开发和运行Java应用程序必不可少的软件包。配置JDK主要包括...
"堆和栈的区别和联系" 堆和栈是 C 语言中两个基本的存储区,它们是程序中实现数据存储的方式。了解堆和栈的区别和联系是非常重要的,因为它们对程序的运行和内存管理有着至关重要的影响。 栈 栈是一块自动分配和...
- 栈的空间较小,由操作系统设定。 - 堆的空间较大,可以动态扩展。 #### 四、具体实例 以下是一个简单的示例代码,展示了堆和栈的使用: ```cpp #include using namespace std; void exampleFunction() { ...
2. **堆区**:这部分内存通常由程序员手动分配和释放,如果程序员忘记释放,操作系统会在程序结束时进行回收。堆区的分配机制更接近链表,而非数据结构中的堆。 3. **全局区(静态区)**:用于存放全局变量和静态...
栈空间由操作系统自动分配和回收,因此访问速度快,但空间相对较小。 - **堆**:是用于存放所有对象实例的区域。当对象被创建时,它会占用堆内存的一部分空间。堆空间是由Java虚拟机(JVM)管理的,通过垃圾回收...
3. 栈的大小由操作系统(OS)和语言的运行时(runtime)决定。 4. 栈比堆要快,因为它存取模式使它可以轻松的分配和重新分配内存。 堆(Heap) 堆是为动态分配预留的内存空间。和栈不一样,从堆上分配和重新分配块...
- **栈**:栈的空间相对较小且固定,通常由操作系统预设一个大小,如在Windows系统中,默认的栈大小为1MB到2MB之间。这主要是为了防止栈占用过多的内存资源而导致其他进程无法正常运行。 - **堆**:堆的空间则相对...
以下是关于堆和栈的详细区别和相关知识点: 1. **栈(Stack)**: - 栈是一种线性数据结构,具有后进先出(LIFO)的特点。 - 在C#和许多其他编程语言中,栈主要用来存储函数调用时的局部变量、函数参数和返回地址...
- 堆的分配和释放相对较慢,因为需要搜索合适的空闲内存块、合并或分割内存空间,甚至可能涉及操作系统调用,因此在性能上不如栈。 了解这些区别对优化代码性能、防止内存泄漏以及有效利用内存资源至关重要。在...
- **堆**:速度较慢,因为涉及操作系统级的内存分配,可能需要更多的系统调用,且存在内存碎片的问题。 3. **用途**: - **栈**:适合存储局部变量和临时数据。 - **堆**:适合存储大对象或长期存在的数据,以及...
在编程领域,堆和栈是两种重要的内存管理机制,它们在程序执行中起着至关重要的作用。理解堆和栈的区别是每一个程序员的基础知识,尤其在面试中常常被问及。 首先,栈(Stack)和堆(Heap)是程序运行时内存的两个...
如果程序员不释放,程序结束时可能由操作系统(OS)回收。堆是C/C++函数库提供的数据结构,用于存储程序中的变量和数据。堆的特点是可以存储大量的数据,且可以动态地分配和释放内存。 在C/C++中,通过malloc、...
- 动态分配:由程序员控制分配和释放,若未释放,则可能由操作系统回收。 - 类型匿名:内存块的类型由指向它的指针决定。 ##### 栈区(Stack) - **定义**:用于存储函数的参数值和局部变量。 - **特点**: - ...
2. **堆区(Heap)**:这一区域通常由程序员手动分配和释放,若不释放则可能由操作系统在程序结束时回收。堆区的分配方式类似于链表。 3. **全局区/静态区(Static)**:用于存放全局变量和静态变量。初始化过的和...
* 堆:首先应该知道操作系统有一个记录空闲内存地址的链表,当系统收到程序的申请时,会遍历该链表,寻找第一个空间大于所申请空间的堆结点,然后将该结点从空闲结点链表中删除,并将该结点的空间分配给程序。...