Objective c 关于stack&;堆

Objective c 关于stack&;堆,objective-c,heap-memory,stack-memory,Objective C,Heap Memory,Stack Memory,我已经读到堆栈用于管理函数调用,其中as堆用于存储正在分配的对象。据我所知,非原语类型的对象将存储在堆中。在堆栈和堆的情况下,我对以下用法感到困惑: 1) 其中原始数据类型、宏(#define)、静态对象、常量和外部? 2) Stacks管理函数调用,但我想知道与函数相关的哪些信息正在推送到堆栈中? 3) 我在某个地方读到,与函数相关的局部对象存储在堆栈中。所以,若任何对象的分配发生在函数内部,那个么使用堆栈还是堆?如果在函数中声明了任何基元类型对象,这些基元类型对象存储在哪里 斯雷 宏在编译时

我已经读到堆栈用于管理函数调用,其中as堆用于存储正在分配的对象。据我所知,非原语类型的对象将存储在堆中。在堆栈和堆的情况下,我对以下用法感到困惑:

1) 其中原始数据类型、宏(#define)、静态对象、常量和外部?
2) Stacks管理函数调用,但我想知道与函数相关的哪些信息正在推送到堆栈中?
3) 我在某个地方读到,与函数相关的局部对象存储在堆栈中。所以,若任何对象的分配发生在函数内部,那个么使用堆栈还是堆?如果在函数中声明了任何基元类型对象,这些基元类型对象存储在哪里

斯雷

  • 宏在编译时解析。常量、全局变量等是数据段的一部分,而不是堆栈或堆

  • 无论何时调用函数,它的参数都会被推送到堆栈上

  • 函数中的所有原语、局部变量等都在堆栈上分配

  • 简而言之,编译器计算每个函数需要多少内存(所有变量使用的总和)。调用该函数时,该大小只需添加到堆栈中,然后在完成时减去

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


    在Objective-C的情况下,只要调用
    alloc
    new
    ,几乎每个对象都会在堆上动态分配。Objective-C就是这样设计的,堆分配是正常的。C和C++往往使用堆上的动态分配。

    了解实际发生的情况,应该建立一个小的C程序并生成汇编代码。br>
    您将发现以下内容:

  • 宏应该在编译时计算,而不是在运行时计算。
  • 常量、全局变量和静态对象被声明为常量并保存到可执行文件本身。
  • 原始数据变量或指针存储在CPU寄存器中(速度非常快,但数量有限),或存储在内存中的堆栈帧中(空间更大,但速度慢约1000倍)。要理解堆栈帧,您应该看一下。基本上,堆栈帧是通过向下移动堆栈指针(指向将新值放入堆栈的内存位置)来构建的(堆栈从大内存地址增长到小内存地址),因此堆栈上有一些未使用的空间,可以在函数期间在本地使用
  • 如果调用函数,返回地址(调用+1之前的指令指针)会被推送到堆栈上,因此当函数返回时,执行会通过从堆栈中弹出返回地址并跳转到它来跳转到返回地址
  • 如果你的函数有很多参数,参数7,8等等。。。在调用函数之前存储在堆栈上。所有以前的参数都存储在寄存器中
  • 与堆栈不同,堆空间是由系统分配的,据我所知,只能通过中断程序并让操作系统为程序分配内存(这将发生在malloc调用中)来访问堆空间。分配对象时(
    [NSObject alloc]
    ),可以在堆内存中找到它们。
  • 摘要

    • 原语值和结构存储在堆栈上函数调用的返回地址旁边
    • 超过几个字节的大内存分配是在堆空间中进行的。这包括使用malloc创建的对象和数组

    2可能正确,也可能不正确,64位C ABI肯定不正确(变量函数除外)@GradyPlayer您的意思是编译器可能选择不复制它吗?如果在标头中声明了基元类型怎么办?在函数调用期间,堆栈中究竟存储了哪些内容?如果一个函数包含多个参数,如何将这些参数推送到堆栈?@sree_iphonedev您指的是原始头中声明的基元类型吗?或者一个类定义否,ABI定义了一个调用约定,在amd64(又名x86-64)ABI中,参数将把前几个标量放在通用寄存器中,浮动在mmx寄存器中,其他类型和后续标量一样放在堆栈上(超过前几个)。。。函数序言和尾声的一部分处理将这些寄存器恢复到调用前的状态,abi还定义了恢复这些值是调用方的责任还是被调用方的责任。。。