澄清堆栈和堆

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

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

SREE。


  • 宏在编译时解析。 Consts,globals等是数据段的一部分 - 不是堆栈或堆。 https://en.wikipedia.org/wiki/Data_segment

  • 无论何时你调用一个函数,它的参数都会被压入堆栈。

  • 函数中的所有基元,局部变量等都分配在堆栈中。

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

    在最原始的层次上,只有在使用堆内存(不包括库)时才会调用malloc

    在Objective-C的情况下,只要调用allocnew几乎每个对象都会在堆上动态分配。 Objective-C的设计方式和堆分配是正常的。 C和C ++倾向于在堆上使用动态分配。


    为了理解真正发生了什么,你应该建立一个小型的c程序并生成汇编代码。

    你会发现有以下几点:

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

  • 原始值和结构体存储在堆栈上函数调用的返回地址旁边
  • 超过几个字节的大内存分配在堆空间中进行。 这包括使用malloc创建的对象和数组。
  • 链接地址: http://www.djcxy.com/p/82881.html

    上一篇: Clarification on stack & heap

    下一篇: Deleting objects on the heap which store data on the heap