我读过堆栈正在使用来管理函数调用,其中堆用于存储正在分配的对象。我的理解是,非原始类型的对象将被存储在堆中。我在堆栈&堆的情况下使用下列用法困惑:关于堆栈和堆的说明
1)原始数据类型,MACROS(#define),静态对象,const和extern?
2)栈管理函数调用,但我想知道什么信息与功能推到栈?
3)我读的地方功能相关的本地对象存储在堆栈。所以如果在函数内部发生任何对象分配,堆栈或堆被使用?如果有任何基本类型的对象是在函数内部声明的,那些在哪里存储?
Sree。
我读过堆栈正在使用来管理函数调用,其中堆用于存储正在分配的对象。我的理解是,非原始类型的对象将被存储在堆中。我在堆栈&堆的情况下使用下列用法困惑:关于堆栈和堆的说明
1)原始数据类型,MACROS(#define),静态对象,const和extern?
2)栈管理函数调用,但我想知道什么信息与功能推到栈?
3)我读的地方功能相关的本地对象存储在堆栈。所以如果在函数内部发生任何对象分配,堆栈或堆被使用?如果有任何基本类型的对象是在函数内部声明的,那些在哪里存储?
Sree。
宏在编译时解析。 Consts,globals等是数据段的一部分 - 不是堆栈或堆。 https://en.wikipedia.org/wiki/Data_segment
无论何时你调用一个函数,它的参数都被压入堆栈。
函数中的所有原语,局部变量等都分配在堆栈上。
简而言之,编译器计算每个函数需要多少内存(它的所有变量使用的总和)。当函数被调用时,只需将大小添加到堆栈,然后在完成时将其减去。
在最原始的层次上,使用堆内存的唯一时间(不包括库)是当您拨打malloc
时。
在Objective-C的情况下,几乎每一个对象在每次你打电话alloc
或new
堆动态分配。 Objective-C的设计方式和堆分配是正常的。 C和C++倾向于在堆上使用动态分配。
为了理解真正发生了什么,您应该构建一个小型的c程序并生成汇编代码。
,你会发现有以下内容:
[NSObject alloc]
),它们可以在堆内存中找到。 摘要
2可能或可能不正确,它肯定与64位C ABI不正确(除了可变参数函数) –
@GradyPlayer你的意思是编译器可能选择不复制它? –
如果原始类型是在头中声明的呢?在函数调用期间确切地说什么内容被存储在堆栈中?如果一个函数包含多个参数,那么这些参数如何被推入堆栈? –