`

栈和堆的区别

    博客分类:
  • C
 
阅读更多
转自: http://book.51cto.com/art/200811/96139.htm

3.1.2 栈和堆的区别

前面已经介绍过,栈是由编译器在需要时分配的,不需要时自动清除的变量存储区。里面的变量通常是局部变量、函数参数等。堆是由malloc()函数(C++语言为new运算符)分配的内存块,内存释放由程序员手动控制,在C语言为free函数完成(C++中为delete)。栈和堆的主要区别有以下几点:

(1)管理方式不同。

栈编译器自动管理,无需程序员手工控制;而堆空间的申请释放工作由程序员控制,容易产生内存泄漏。

(2)空间大小不同。

栈是向低地址扩展的数据结构,是一块连续的内存区域。这句话的意思是栈顶的地址和栈的最大容量是系统预先规定好的,当申请的空间超过栈的剩余空间时,将提示溢出。因此,用户能从栈获得的空间较小。

堆是向高地址扩展的数据结构,是不连续的内存区域。因为系统是用链表来存储空闲内存地址的,且链表的遍历方向是由低地址向高地址。由此可见,堆获得的空间较灵活,也较大。栈中元素都是一一对应的,不会存在一个内存块从栈中间弹出的情况。

(3)是否产生碎片。

对于堆来讲,频繁的malloc/free(new/delete)势必会造成内存空间的不连续,从而造成大量的碎片,使程序效率降低(虽然程序在退出后操作系统会对内存进行回收管理)。对于栈来讲,则不会存在这个问题。

(4)增长方向不同。

堆的增长方向是向上的,即向着内存地址增加的方向;栈的增长方向是向下的,即向着内存地址减小的方向。

(5)分配方式不同。

堆都是程序中由malloc()函数动态申请分配并由free()函数释放的;栈的分配和释放是由编译器完成的,栈的动态分配由alloca()函数完成,但是栈的动态分配和堆是不同的,他的动态分配是由编译器进行申请和释放的,无需手工实现。

(6)分配效率不同。

栈是机器系统提供的数据结构,计算机会在底层对栈提供支持:分配专门的寄存器存放栈的地址,压栈出栈都有专门的指令执行。堆则是C函数库提供的,它的机制很复杂,例如为了分配一块内存,库函数会按照一定的算法(具体的算法可以参考数据结构/操作系统)在堆内存中搜索可用的足够大的空间,如果没有足够大的空间(可能是由于内存碎片太多),就有需要操作系统来重新整理内存空间,这样就有机会分到足够大小的内存,然后返回。显然,堆的效率比栈要低得多。
分享到:
评论

相关推荐

    内存中堆和栈的分配区别

    ### 堆和栈的主要区别 #### 内存分配方式 - **栈**:由操作系统自动分配和回收,通常在函数调用时创建,函数返回时销毁。 - **堆**:由程序员主动控制分配和释放,可以在任何时候请求或释放内存,但需注意避免内存...

    深入堆与栈 堆与栈的区别

    下面通过几个具体的示例来进一步理解堆和栈的概念以及它们之间的区别。 ##### 示例1:局部变量与对象引用 ```java int a = 3; int b = 3; ``` 在这段代码中,`a` 和 `b` 都是整型变量,它们被声明为局部变量并...

    堆和栈的区别和联系。

    "堆和栈的区别和联系" 堆和栈是 C 语言中两个基本的存储区,它们是程序中实现数据存储的方式。了解堆和栈的区别和联系是非常重要的,因为它们对程序的运行和内存管理有着至关重要的影响。 栈 栈是一块自动分配和...

    C语言 堆和栈的区别

    C语言堆和栈的区别 C语言中,堆(heap)和栈(stack)是两种不同的内存分配机制。堆是由malloc或new分配的内存,系统不释放,需要程序员自己释放,否则会出现“内存泄露(Memory Leak)”。栈是自动分配的内存,...

    堆和栈的区别详细说明

    ### 堆和栈的区别详细说明 在计算机科学与编程领域中,堆(Heap)与栈(Stack)是两种非常重要的内存管理方式。它们在内存分配、管理方式、空间大小等方面有着显著的不同,这些差异决定了它们各自适用于不同的场景...

    docnetc#中栈和堆的区别及代码在栈和堆中的执行流程详解之一.pdf

    在.NET框架下,理解栈和堆的区别对于优化代码性能至关重要,尽管内存管理和垃圾回收由框架自动处理。栈和堆是两种不同的内存区域,各自承担不同的职责。 栈主要负责保存代码的执行路径,也就是方法调用的上下文。...

    堆和栈的区别

    ### 堆和栈的区别详解 #### 一、引言 在编程中,了解不同内存区域的特点及其使用方法是非常重要的。本文将详细解释堆和栈这两种常见内存区域的区别,包括它们的基本概念、特点以及应用场景。 #### 二、基础知识:...

    C#中堆和栈的区别分析

    C#中堆和栈的区别分析 C# 中堆和栈的区别分析是理解 .NET 框架中内存管理的关键。堆和栈是两个基本元素,组成我们 C# 程序的运行环境。在这个知识点中,我们将详细介绍堆和栈的概念、类型变量、分配机制、生命周期...

    java 栈和堆区别详细介绍

    下面将详细介绍Java栈和堆的区别。 首先,栈是线程私有的,而堆是所有线程共享的。这意味着每个线程都有自己独立的栈空间,用于存储局部变量、方法参数和方法调用等。当一个方法被调用时,一个新的栈帧(Stack ...

    堆和栈的区别 堆和栈的区别

    堆和栈的区别 堆和栈是计算机内存管理中两个重要的概念,它们都是程序运行时的内存分配方式,但是它们之间有着明显的区别。 1. 预备知识—程序的内存分配 程序的内存分配可以分为五个部分:栈区、堆区、全局区、...

    docnetc#中栈和堆的区别及代码在栈和堆中的执行流程详解之一 (2).pdf

    声明,比如在类的成员变量中,那么它会被存储在堆中,因为类实例本身就在堆上。这是由于引用类型(如类)的对象在...因此,作为一名专业的.NET开发者,深入理解栈和堆的区别以及它们在代码执行中的作用是至关重要的。

    堆与栈的区别

    以下是关于堆和栈的详细区别和相关知识点: 1. **栈(Stack)**: - 栈是一种线性数据结构,具有后进先出(LIFO)的特点。 - 在C#和许多其他编程语言中,栈主要用来存储函数调用时的局部变量、函数参数和返回地址...

    给出的堆和栈的区别解释

    堆和栈的区别解释 堆和栈是计算机科学中两个基本概念,尤其在C/C++编程中.play a crucial role. 在这篇文章中,我们将详细解释堆和栈的区别,包括它们在内存中的存储方式、生命周期、优缺点等方面。 堆(Heap) ...

    堆和栈详细,编程必知

    首先,我们要明白栈和堆的主要区别。栈是一种后进先出(LIFO,Last In First Out)的数据结构,它主要用于存储临时变量、函数调用时的参数、返回地址等。每次函数调用都会在栈上创建一个新的上下文,当函数执行完毕...

    内存中的堆与栈区别 内存中的堆与栈区别

    那么栈和堆的区别到底在哪里呢? 内存分配方面 堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由 OS 回收。注意它与数据结构中的堆是两回事,分配方式是类似于链表。可能用到的关键字如下:new、...

    Java堆和栈的区别

    "Java 堆和栈的区别" Java 堆和栈是 Java 中的两种内存管理机制,它们都是 Java 用来在 RAM 中存放数据的地方。但是,它们有很多不同之处。 Java 堆是一个运行时数据区,类的对象从中分配空间。这些对象通过 new、...

    内存中堆和栈的区别

    内存中堆和栈的区别 内存中堆和栈是两个不同的概念,都是用来存放数据的内存区域,但它们有所区别。 内存分配方面 堆:一般由程序员分配释放,若程序员不释放,程序结束时可能由 OS 回收。堆的分配方式类似于链表...

    docnetc#中栈和堆的区别及代码在栈和堆中的执行流程详解之一.docx

    在.NET Framework中,内存管理是自动进行的,主要包括栈和堆两种主要的内存区域。栈主要存储临时变量和函数调用的信息,而堆主要用于存储复杂对象和数据结构。理解这两者的区别对于优化代码和理解变量行为至关重要。...

    堆和栈详解

    在深入探讨这两个概念之前,我们需要明确一点:堆和栈在内存结构上有着本质的区别。 栈(Stack)是一种线性数据结构,其特点是后进先出(Last In First Out, LIFO)。在程序执行时,系统会为每个线程分配一个栈,...

    栈和堆的区别 doc

    栈和堆是编程中两种重要的内存管理方式,它们在计算机程序中扮演着至关重要的角色,尤其是在内存分配和释放上。栈和堆之间的主要差异可以从以下几个方面进行深入理解: 1. **管理方式**: - 栈(Stack)的管理由...

Global site tag (gtag.js) - Google Analytics