iOS中的堆(heap)和栈(stack)的理解

转载 2016年08月30日 15:45:37

操作系统iOS中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:“text segment“,“stack segment”,“heap segment”。


当应用开始以后,函数main() 被调用,一些空间分配在”stack” 中。这是为应用分配的另一个段的内存空间,这是为了函数变量存储需要而分配的内存。每一次在应用中调用一个函数,“stack ”的一部分会被分配在”stack” 中,称之为”frame” 。新函数的本地变量分配在这里。

正如名称所示,“stack ”是后进先出(LIFO )结构。当函数调用其他的函数时,“stack frame ”会被创建;当其他函数退出后,这个“frame ”会自动被破坏。

 “heap” 段也称为”data” 段,提供一个保存中介贯穿函数的执行过程,全局和静态变量保存在“heap ”中,直到应用退出。

为了访问你创建在heap 中的数据,你最少要求有一个保存在stack 中的指针,因为你的CPU 通过stack 中的指针访问heap 中的数据。

你可以认为stack 中的一个指针仅仅是一个整型变量,保存了heap 中特定内存地址的数据。实际上,它有一点点复杂,但这是它的基本结构。

 

简而言之,操作系统使用stack 段中的指针值访问heap 段中的对象。如果stack 对象的指针没有了,则heap 中的对象就不能访问。这也是内存泄露的原因。

在iOS 操作系统的stack 段和heap 段中,你都可以创建数据对象。

stack 对象的优点主要有两点,一是创建速度快,二是管理简单,它有严格的生命周期。stack 对象的缺点是它不灵活。创建时长度是多大就一直是多大,创建时是哪个函数创建的,它的owner 就一直是它。不像heap 对象那样有多个owner ,其实多个owner 等同于引用计数。只有heap 对象才是采用“引用计数”方法管理它。

stack 对象的创建

只要栈的剩余空间大于stack 对象申请创建的空间,操作系统就会为程序提供这段内存空间,否则将报异常提示栈溢出。

heap 对象的创建

操作系统对于内存heap 段是采用链表进行管理的。操作系统有一个记录空闲内存地址的链表,当收到程序的申请时,会遍历链表,寻找第一个空间大于所申请的heap 节点,然后将该节点从空闲节点链表中删除,并将该节点的空间分配给程序。

例如:

NSString 的对象就是stack 中的对象,NSMutableString 的对象就是heap 中的对象。前者创建时分配的内存长度固定且不可修改;后者是分配内存长度是可变的,可有多个owner, 适用于计数管理内存管理模式。

两类对象的创建方法也不同,前者直接创建“NSString * str1=@"welcome"; “,而后者需要先分配再初始化“ NSMutableString * mstr1=[[NSMutableString alloc] initWithString:@"welcome"]; ”。

 

(miki西游 @mikixiyou 原文链接: http://mikixiyou.iteye.com/blog/1595230 )

 

再补充一点,这里说的是操作系统的堆和栈。

在我们学习“数据结构”时,接触到的堆和栈的概念和这个操作系统中的堆和栈不是一回事的。

操作系统的堆和栈是指对内存进行操作和管理的一些方式。


“数据结构“的堆实际上指的就是(满足堆性质的)优先Queue 的一种数据结构,第1 个元素有最高的优先权;栈实际上就是满足先进后出的性质的数据或数据结构。

堆内存(Heap)和栈内存(Stack)详解

原文地址:http://blog.csdn.net/abcjennifer/article/details/39780819 堆:顺序随意  栈:先进后出  堆和栈的...
  • Meta_Cpp
  • Meta_Cpp
  • 2015年01月09日 14:02
  • 2507

堆(heap)和栈(stack)有什么区别??

堆栈存放用户自己用malloc分配的空间,用free来释放;由用户自己管理,而栈存放函数的局部变量,由编译器来负责分配和回收管理,速度快,但容量有限, 简单的可以理解为:  heap:是由ma...
  • ly0303521
  • ly0303521
  • 2015年04月09日 19:40
  • 1658

c++中堆和栈的的区别(stack vs heap)

 堆和栈的区别 一、预备知识—程序的内存分配 一个由c/C++编译的程序占用的内存分为以下几个部分 1、栈区(stack)— 由编译器自动分配释放 ,存放函数的参数值,局部变量的值等。其操...
  • hyqsong
  • hyqsong
  • 2014年12月18日 15:57
  • 2688

iOS中的堆(heap)和栈(stack)的理解

操作系统iOS 中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:“text segment “,“stack segment ”,“heap segme...
  • leikezhu1981
  • leikezhu1981
  • 2015年04月23日 15:06
  • 564

iOS:堆(heap)和栈(stack)的理解

iOS:堆(heap)和栈(stack)的理解
  • RainShenJi
  • RainShenJi
  • 2015年02月14日 15:03
  • 527

iOS中的堆(heap)和栈(stack)的理解

操作系统iOS 中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:“text segment “,“stack segment ”,“heap segme...
  • u013148118
  • u013148118
  • 2015年05月21日 16:38
  • 314

iOS中的堆(heap)和栈(stack)的理解

操作系统iOS 中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:“text segment “,“stack segment ”,“heap segme...
  • u012894631
  • u012894631
  • 2013年12月16日 18:24
  • 440

iOS中的堆(heap)和栈(stack)的理解

操作系统iOS 中应用程序使用的计算机内存不是统一分配空间,运行代码使用的空间在三个不同的内存区域,分成三个段:“text segment “,“stack segment ”,“heap segme...
  • vgoyan
  • vgoyan
  • 2014年09月29日 14:31
  • 286

iOS中的堆(heap)和栈(stack)的理解

当应用开始以后,函数main() 被调用,一些空间分配在”stack” 中。这是为应用分配的另一个段的内存空间,这是为了函数变量存储需要而分配的内存。每一次在应用中调用一个函数,“stack ”的一部...
  • qq244272324
  • qq244272324
  • 2014年09月16日 15:51
  • 582

iOS:堆(heap)和栈(stack)的理解

Objective-C的对象在内存中是以堆的方式分配空间的,并且堆内存是由你释放的,即release 栈由编译器管理自动释放的,在方法中(函数体)定义的变量通常是在栈内,因此如果你的变量要跨函数...
  • SomnusLee1988
  • SomnusLee1988
  • 2013年12月10日 21:00
  • 430
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:iOS中的堆(heap)和栈(stack)的理解
举报原因:
原因补充:

(最多只允许输入30个字)