澄清堆栈和堆
我已经读过堆栈正在使用来管理函数调用,其中堆用于存储正在分配的对象。 我的理解是,非原始类型的对象将被存储在堆中。 在堆栈和堆的情况下,我对以下用法感到困惑:
1)哪里的原始数据类型,MACROS(#define),静态对象,const和extern?
2)Stacks管理函数调用,但是我想知道与这些函数相关的信息是否推送到堆栈?
3)我在某处读取函数相关的本地对象存储在堆栈中。 所以如果在函数内部发生任何对象分配,堆栈或堆被使用? 如果有任何基本类型的对象是在函数内部声明的,那些在哪里存储?
SREE。
宏在编译时解析。 Consts,globals等是数据段的一部分 - 不是堆栈或堆。 https://en.wikipedia.org/wiki/Data_segment
无论何时你调用一个函数,它的参数都会被压入堆栈。
函数中的所有基元,局部变量等都分配在堆栈中。
简而言之,编译器会计算每个函数需要多少内存(所有变量使用的总和)。 当函数被调用时,只需将大小添加到堆栈,然后在完成时将其减去。
在最原始的层次上,只有在使用堆内存(不包括库)时才会调用malloc
。
在Objective-C的情况下,只要调用alloc
或new
几乎每个对象都会在堆上动态分配。 Objective-C的设计方式和堆分配是正常的。 C和C ++倾向于在堆上使用动态分配。
为了理解真正发生了什么,你应该建立一个小型的c程序并生成汇编代码。
你会发现有以下几点:
[NSObject alloc]
)时,它们可以在堆内存中找到。 概要
上一篇: Clarification on stack & heap
下一篇: Deleting objects on the heap which store data on the heap