堆和栈的概念

数据在内存中的存放
        在计算机系统中,运行的应用程序的数据都是保存在内存之中。
        不同类型的数据,保存的内存区域不同,其中包括:
        1.栈区:(stack)由编译器自动分配并释放,一般存放函数的参数值,局部变量等。
        2.堆区:(heap)由程序猿分配和释放,如果程序猿不释放,程序结束时,可能由操作系统回收。
        3.寄存器区:用来保存栈顶指针和指令指针。
        4.全局区(静态区):全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后由系统释放。
        5.文字常量区:存放常量字符串,程序结束后由系统释放。
        6.程序代码区:存放函数的二进制代码。

栈区中的数据
        应用程序启动后,操作系统会为应用程序在栈区开辟内存空间,用于存放局部变量,以及函数的参数等。
        iOS主线程栈区大小为1M,MAC主线程栈区大小为8M.
        栈区中的变量由编译器负责分配和释放。
        栈区中的数据是以“栈”的形式管理的,先进后出(FIBO)。
        访问栈区中变量的效率高,不会出现内存碎片。
        栈区中的变量名(不带*)相当于是指向栈区数据的指针别名,变量名可以简化程序员的工作。
    栈中地址是从高地址——>低地址。

堆中的数据
        由于栈区的空间有限,iOS的应用程序中,对象都是建立在堆中的。
        堆区包括系统内存和虚拟内存(硬盘内存),由所有正在运行的应用程序共享使用。
        堆区中的内存分配由操作系统使用一个链表统一维护所有已经分配的内存记录。
        由于堆区是由所有应用程序共享的,操作系统以匿名(只记录内存地址和大小,不记录具体类型)的方式记录已经分配的内存区域。
        要访问堆区中的数据,必须通过指针的方式才可以进行,指针的类型决定了访问堆中数据的方式。
        当某一内存区域不再使用时,程序需要通知操作系统回收该区域内存,从而可以保证该内存区域被其它程序再次使用,否则,该区域将永远无法再次被分配,这就是传说中的“内存泄露”。
        如果某一区域已经被释放,仍然试图访问该区域,会提示“坏内存访问”,这就是传说中的“野指针访问”。
        相比较栈区,堆区中的效率要低很多,同时容易出现内存碎片。
        相比较栈区,堆区中的访问方式更加灵活,对象占用的内存也可以更大。

时间: 2024-11-03 20:55:00

堆和栈的概念的相关文章

JAVA中用堆和栈的概念来理解equals() "=="和hashcode()

在学习java基本数据类型和复杂数据类型的时候,特别是equals()"=="和hashcode()部分时,不是很懂,也停留了很长时间,最后终于有点眉目了. 要理解equals()"=="和hashcode(),最好先了解Java内存中堆和栈的知识: 下面一段是参考自http://www.cnblogs.com/whgw/archive/2011/09/29/2194997.html 大家也可点进去查看更详细的解释. Java 中的堆和栈  Java把内存划分成两种

【C++基础 01】堆和栈的概念

好记性不如烂笔头,学习c++的时间也不是很久,趁着这段时间看 <C++ Primer>将学习笔记整理一下,与君共勉. ==================================================================== 首先要区分一下概念: [数据结构的栈和堆] 堆:也叫优先队列,是一棵完全二叉树,它的特点是父节点的值大于(小于)两个子节点的值(分别称为大顶堆和小顶堆).它常用于管理算法执行过程中的信息,应用场景包括堆排序,优先队列等. 栈:具有后进先出性质

java中的堆和栈的概念和区别

在说堆和栈之前,我们先说一下JVM(虚拟机)内存的划分: Java程序在运行时都要开辟空间,任何软件在运行时都要在内存中开辟空间,Java虚拟机运行时也是要开辟空间的.JVM运行时在内存中开辟一片内存区域,启动时在自己的内存区域中进行更细致的划分,因为虚拟机中每一片内存处理的方式都不同,所以要单独进行管理. JVM内存的划分有五片: 1.   寄存器: 2.   本地方法区: 3.   方法区: 4.   栈内存: 5.   堆内存. 我们重点来说一下堆和栈: 栈内存:栈内存首先是一片内存区域,

java中堆和栈的概念

1.在函数中定义的一些基本类型的变量和对象的引用变量都在函数的栈内存中分配. 2.堆内存用来存放由new创建的对象和数组. 3.在堆中产生了一个数组或对象后,还可以在栈中定义一个特殊的变量.让栈中这个变量的取值等于数组或对象在堆内存中的首地址,栈中的这个变量就成了数组或者对象的引用变量.(引用变量就相当于是为数组或对象起的名字,以后就可以在程序中使用栈中的引用变量来访问堆中的数组或者对象)

堆VS栈

c#堆VS栈(Part One) 前言 本文主要是讲解C#语言在内存中堆.栈的使用情况,使读者能更好的理解值类型.引用类型以及线程栈.托管堆. 首先感谢原文作者:Matthew Cochran 为我们带来了一篇非常好的文章,并配以大量图示,帮助我们更好的理解堆栈之间的调用,本文是在作者原文的基础上进行内容上的精简以及加入我个人在这方面的理解和注释. 最后要感谢博客园的田志良,当我搜索堆栈内部使用时,搜索到了作者的文章,吸取了大量有用的知识,而且翻译的也非常好.唯一美中不足的可能是仅仅翻译了Mat

浅谈堆和栈的区别

笔者作为一个小白,对于堆和栈的概念,总是感觉很朦胧,他们认识我,而我只是偶尔见过,并没有深交 然而在计算机领域,堆栈是一个不容忽视的概念,堆栈是 两种数据结构.堆栈都是一种数据项按序排列的数据结构,只能在一端(称为栈顶(top))对数据项进行插入和删除.在单片机应用中,堆栈是个特殊的存储 区,主要功能是暂时存放数据和地址,通常用来保护断点和现场.要点:堆,队列优先,先进先出(FIFO—first in first out).栈,先进后出(FILO—First-In/Last-Out). 一般情况

【转载】iOS堆和栈的理解

操作系统iOS 中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:“text segment “,“stack segment ”,“heap segment ”. 段“text segment ”是应用程序运行时应用程序代码存在的内存段.每一个指令,每一个单个函数.过程.方法和执行代码都存在这个内存段中直到应用程序退出.一般情况下,你不会真的不得不知道这个段的任何事情. 当应用开始以后,函数main() 被调用,一些空间分配在”stack” 中.这

堆与栈区别

一.堆和栈的概念区别堆:是大家共有的空间,分全局堆和局部堆.全局堆就是所有没有分配的空间,局部堆就是用户分配的空间.堆在操作系统对进程 初始化的时候分配,运行过程中也可以向系统要额外的堆,但是记得用完了要还给操作系统,要不然就是内存泄漏.堆里面一般 放的是静态数据,比如static的数据和字符串常量等,资源加载后一般也放在堆里面.一个进程的所有线程共有这些堆 ,所以对堆的操作要考虑同步和互斥的问题.程序里面编译后的数据段都是堆的一部分. 栈:是个线程独有的,保存其运行状态和局部自动变量的.栈在线

译文---C#堆VS栈(Part One)

原文:译文---C#堆VS栈(Part One) 前言 本文主要是讲解C#语言在内存中堆.栈的使用情况,使读者能更好的理解值类型.引用类型以及线程栈.托管堆. 首先感谢原文作者:Matthew Cochran 为我们带来了一篇非常好的文章,并配以大量图示,帮助我们更好的理解堆栈之间的调用,本文是在作者原文的基础上进行内容上的精简以及加入我个人在这方面的理解和注释. 最后要感谢博客园的田志良,当我搜索堆栈内部使用时,搜索到了作者的文章,吸取了大量有用的知识,而且翻译的也非常好.唯一美中不足的可能是