函数方法不占额外存储空间(内存分区)?

上篇博客说到扩展是不会增加存储空间的,且扩展不能扩展存储属性。既然这样,那我们就能理所应当推断出方法是不占存储空间的,为什么呢?

首先,我们要先了解内存的五大分区:栈,堆,静态区,常量区以及代码区。

栈区:栈区是由编译器统一释放的,且栈根据先进后出的特点可以很好的保存现场,通常我们调用一个函数时,那么这个函数就会进入该栈区域。

函数执行时,相关的数据存储在栈区,包括:

• 函数的参数。

• 函数的局部变量。

• 返回地址。

这些临时数据在函数调用完成后会被回收,因此函数不会对实例的长期存储造成影响。栈是一个连续的内存区域,按照后进先出的规则,内存的分配和释放只涉及简单的指针移动,非常高效。

堆区:由程序员分配和释放,如果程序员不释放,程序结束时,可能会由操作系统回收 ,比如变量通过new、alloc、malloc、realloc分配的内存块就存放在堆区。堆向高地址扩展的数据结构,是不连续的内存区域。 程序员负责在何时释放内存,在ARC程序中,计数器为0的时候,在当次的runloop结束后,释放掉内存。堆中的所有东西都是匿名的,这样不能按名字访问,而只能通过指针访问。堆是一块非连续的内存空间,为了支持动态内存分配,堆需要通过复杂的算法(如分块管理或内存池)来找到适合大小的内存块。分配和释放内存的过程涉及更多操作,因此速度较慢。

常量区 文字常量区: 存放常量字符串,程序结束后由系统释放。该区是编译时分配的内存空间,在程序运行过程中,此内存中的数据一直存在,程序结束后由系统释放。 存放常量:整型、字符型、浮点、字符串等。

静态区 全局区(静态区) : 全局变量和静态变量的存储是放在一起的,初始化的全局变量和静态变量存放在一块区域,未初始化的全局变量和静态变量在相邻的另一块区域,程序结束后由系统释放。

代码区:代码区用于存放可执行文件的操作指令(存放函数的二进制代码),即存放程序的所有代码。代码区的内存分配是在程序启动时完成的,且在程序运行期间一直存在

由此我们可以得知,函数方法是存放在代码区域的,代码段是只读的,包含了程序的机器指令,多个调用者可以共享这些代码段,因此函数代码本身不会重复占用内存。因此,我们常说“函数不占存储空间”实际上是指函数代码不会在每次调用时额外分配新的存储空间。

一个函数调用的过程:

(1)创建栈帧,系统在栈上为被调用函数分配一块新的栈帧,用于保存函数的局部信息。(返回地址,参数,局部变量,寄存器保存区)

(2)栈指针的移动,栈指针会向下移动以为新的栈帧分配空间

(3)函数的执行,被调用的函数使用自己的栈帧完成内部操作,栈帧中的局部变量会随着函数的执行不断被使用和修改。

(4)函数的返回函数执行完成后,栈帧被回收,栈指针(SP)向上移动,恢复到主调函数的栈帧位置,返回地址被加载到程序计数器(PC,Program Counter),程序跳回主调函数继续执行。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值