美文网首页
十三.函数本质之02局部变量

十三.函数本质之02局部变量

作者: mkb2 | 来源:发表于2017-05-16 23:03 被阅读20次

当程序一启动的时候,系统分配了栈空间,然后大家都可以用,任何函数都可以使用;

图1.我们打算用汇编编写这样的程序

讲解:
1.当执行第9行代码时候,先将参数压入栈3,4
2.将下一行代码地址压入栈
3.让bp指针指向sp这个位置
4.sp直接减去一个数,直接往上升,开辟的空间,用来放置局部变量
5.调用局部函数
6.调用局部函数完毕,sp指向bp位置
7.执行完毕整个main函数之后,sp指向原点,栈底

局部变量在栈中

当系统调用一个函数的时候,系统会给这个函数分配一个内存空间,用来计算使用;
当我们执行完毕函数,不用去清理,只要操作好执行就行,将来这块空间,直接让别人来覆盖就好了;

1.执行子函数之前,参数和地址入栈,sp指向该位置 2.bp指向sp位置 3.sp减去一个数,往上移动,开辟给局部变量的空间 4.执行完局部函数,sp指向bp位置 5.执行完毕main函数,栈平衡,不用管这些数据,放那就行,将来会有其他数据覆盖的

bp的好处在于,上下都是很近,并且不让直接给sp赋值,所以规定使用bp
每一次指针移动的时候,单位都是(加或者减)2
将来会有其他数据覆盖他的


说完了原理,我们使用汇编编写一下

汇编编写一下逻辑 执行完毕函数,然后指针又回去了,那几个内存空间被占用了,我们不用管,将来又有其他数据占用他们的 执行汇编之前,栈顶位置和内存全是干净的

只有递归会出现这种情况,会出现多次占用内存的情况,将来会出现栈溢出问题;
但是正常的函数,sp调用完毕函数,就回到原点,所以没问题,即使我们多次调用这个函数,其实也是没有问题的,

只有递归会出现这种情况

将来问题死掉使用为找不到内存地址了,crash了

注意:当调用函数的时候,使用到了参数,那么我们就要使用到“内平参”或者“外平参”;如果函数没有使用到参数,call和ret就可以搞定了;

多个函数调用,查看内存空间分配情况 多个函数一起的时候,各自分配了内存空间,互不干扰

实际上我们常说的销毁空间,并不是真的销毁,而是将这段空间置之不理,哪怕有垃圾数据也没事,将来自然有其他的数据过来搞;

相关文章

  • 十三.函数本质之02局部变量

    当程序一启动的时候,系统分配了栈空间,然后大家都可以用,任何函数都可以使用; 讲解:1.当执行第9行代码时候,先将...

  • 最全解析Blcok

    一、何为Block? 普遍的解释是:带有自动变量(局部变量)的匿名函数。其本质是个结构体。 匿名函数 : 不带有名...

  • Python函数详解

    作业讲解 认识Python函数 函数的本质就是功能的封装。使用函数可以大大提高编程的效率与程序的可读性。 局部变量...

  • 闭包的理解

    闭包就是定义在其他函数内部的函数,并且能够读取其他函数的局部变量,所以,在本质上,闭包就是将函数内部和函数外部连接...

  • The iOS Apprentice1-11/12(Page86

    01. showAlert()函数中追加判断,根据差值确定等级,并提示给用户。 02. 局部变量 local va...

  • Python爬虫day2.2—python函数详解

    1. 认识python函数 函数的本质就是功能的封装。使用函数可以大大提高编程的效率与程序的可读性 2. 局部变量...

  • 探索 Block 的本质

    定义 Block 是 C 语言的扩充功能 Block 是带有自动变量(局部变量)的匿名函数 本质 Block 是一...

  • iOS面试杂记

    1. 函数局部变量的return R:一般的来说,函数是可以返回局部变量的。 局部变量的作用域只在函数内部,在函数...

  • 《C++ Primer》笔记

    返回局部变量的引用 C++的引用太强大了,但局部变量的引用无法传递到函数外,而Go的&符号本质上不是引用而是new...

  • 8.iOS开发之block

    block简介 block(闭包)的本质是对象,是带有自动变量(局部变量)的匿名函数。 block与变量 值拷贝 ...

网友评论

      本文标题:十三.函数本质之02局部变量

      本文链接:https://www.haomeiwen.com/subject/vydrxxtx.html