objective-c - 关于栈和堆的说明

标签 objective-c heap-memory stack-memory

我读到堆栈用于管理函数调用,而堆用于存储正在分配的对象。我的理解是非原始类型对象将存储在堆中。我对堆栈和堆的以下用法感到困惑:

1) 原始数据类型、MACROS(#define)、静态对象、const 和 extern 在哪里?
2)堆栈管理函数调用,但我想知道与函数相关的哪些信息被推送到堆栈?
3)我在某处读到,与函数相关的本地对象存储在堆栈中。那么,如果在函数内部发生任何对象分配,那么会使用堆栈还是堆?如果在函数内部声明了任何基本类型对象,那么它们存储在哪里?

斯雷。

最佳答案

  1. 宏在编译时解析。常量、全局变量等是数据段的一部分,而不是堆栈或堆。 https://en.wikipedia.org/wiki/Data_segment

  2. 每当您调用函数时,它的参数都会被插入堆栈。

  3. 函数内的所有原语、局部变量等都在堆栈上分配。

简单来说,编译器计算每个函数需要多少内存(其所有变量使用量的总和)。当函数被调用时,大小被简单地添加到堆栈中,然后在完成时被减去。

在最原始的级别,唯一使用堆内存(不包括库)的时间是调用 malloc 时。

对于 Objective-C 来说,每当您调用 allocnew 时,几乎每个对象都会在堆上动态分配。 Objective-C 就是这样设计的,堆分配是正常的。 C 和 C++ 倾向于较少使用堆上的动态分配。

关于objective-c - 关于栈和堆的说明,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34346910/

相关文章:

ios - 访问包装在单独类中的静态方法中的 NSURLSessionTasks 的委托(delegate)

使用 free() 时 C 堆缓冲区损坏

c - 如何在程序集级别写入具有负偏移量的文件?

c++ - 使用堆或堆栈变量更好吗?

ios - 本地通知问题

objective-c - 有没有一种简单的方法可以将 ISO8601 时间戳转换为格式化的 NSDate?

c++ - 堆优化(但不限于)单线程使用

c - 解决错误 'Address of stack memory associated with local variable returned'

c++ - 类成员和显式堆栈/堆分配

iphone - 在电影播放结束时切换 View Controller ?