我已经读过堆栈用于管理函数调用,其中堆用于存储正在分配的对象。据我所知,非原始类型的对象将存储在堆中。在堆栈和放大器的情况下,我对以下用法感到困惑堆:
1)原始数据类型,MACROS(#define),静态对象,const和extern?
2)堆栈管理函数调用,但我想知道与函数相关的哪些信息正在推送到堆栈?
3)我在某处读到函数相关的本地对象存储在Stack中。那么如果对象的任何分配发生在函数内部,那么使用堆栈或堆?如果在函数内声明了任何原始类型对象,那么它们存储在哪里?
SREE。
答案 0 :(得分:1)
宏在编译时解析。 Consts,globals等是数据段的一部分 - 而不是堆栈或堆。 https://en.wikipedia.org/wiki/Data_segment
每当你调用一个函数时,它的参数都会被压入堆栈。
函数内的所有原语,局部变量等都在堆栈中分配。
简化来说,编译器会计算每个函数需要多少内存(其所有变量用法的总和)。调用该函数时,只需将大小添加到堆栈中,然后在完成时将其减去。
在最原始的级别上,使用堆内存的唯一时间(不包括库)就是在您调用malloc
时。
在Objective-C的情况下,每当您调用alloc
或new
时,几乎每个对象都会在堆上动态分配。 Objective-C的设计方式和堆分配是正常的。 C和C ++倾向于在堆上使用动态分配。
答案 1 :(得分:1)
要了解真正发生的事情,您应该构建一个小型c程序并生成它的汇编代码。
你会发现以下内容:
[NSObject alloc]
)时,可以在堆内存中找到它们。
<强>摘要强>