美文网首页
方法执行的压栈分析

方法执行的压栈分析

作者: 萧修 | 来源:发表于2023-03-24 14:42 被阅读0次

    区分编译性语言和解释性(直译)语言
    了解栈的数据结构,以及压栈出栈了解
    回顾之前iOS内存分区
    了解程序方法执行的压栈操作

    熟悉方法的执行在栈上,由CPU控制执行。之前只记得iOS方法的查找和异常抛出,也要了解方法的压栈执行,进一步熟悉栈的数据结构

    编译和直译

    编译:将源码全部转换为可执行的二进制代码,然后执行。
    或者可以说将一段程序直接翻译成机器码(对于C/C++这种跨平台的语言)或者
    中间码(Java这种跨平台语言,需要虚拟机将中间码映射为机器码),需要编译器。
    
    直译:只有运行,没有编译过程,将一段程序解释成有逻辑操作符.
    由解释器按程序的逻辑顺序调用操作符,需要解释器。
    
    区别:一般编译程序产生目标代码的执行速度比直译的执行速度快,因为省去了逻辑顺序。
    

    通俗来讲,编译执行就像点菜吃饭,上桌直接吃,解释执行像吃火锅,边煮边吃。

    编译性语言:C/C++、OC、Swift、Java

    解释性语言:JavaScript、python

    一些语言特色:Java的动态绑定机制、oc的runtime、swift增加@objc赋予动态性

    栈的结构:

    仅在表尾端进行插入和删除的线性表,表尾端为栈顶,表头为栈底,不含元素为空栈。
    先进后出,就像手枪弹夹的子弹进出。记得数据结构中,栈的操作是移动栈顶指针top+1、后存入元素,栈base指针是不动的。

    了解这些 一定区分关键词:
    表尾,栈顶,top指针 都在一端操作删除和删除
    栈底,base

    记忆方法,弹夹子弹,矿泉水装的球,表尾端操作的栈顶有top指针。
    再强调一下, 表尾端是栈顶

    方法压栈

    JVM方法执行本质,在栈空间开辟独立空间讲解:

    Java栈也称作虚拟机栈(Java Vitual Machine Stack),
    也就是我们常常所说的栈,跟C语言的数据段中的栈类似。
    事实上,Java栈是Java方法执行的内存模型。为什么这么说呢?下面就来解释一下其中的原因。
    
    Java栈中存放的是一个个的栈帧,每个栈帧对应一个被调用的方法,
    在栈帧中包括局部变量表(Local Variables)、操作数栈(Operand Stack)、
    指向当前方法所属的类的运行时常量池(运行时常量池的概念在方法区部分会谈到)的引用、
    方法返回地址(Return Address)和一些额外的附加信息。
    当线程执行一个方法时,就会随之创建一个对应的栈帧,并将建立的栈帧压栈。
    当方法执行完毕之后,便会将栈帧出栈。
    因此可知,线程当前执行的方法所对应的栈帧必定位于Java栈的顶部。
    

    以此类推:iOS方法执行(isa查找方法不做讲解)
    我们的程序由一个一个方法组成,CPU负责调度这些方法,当我们程序执行到某方法时,需要在栈上开辟空间,此时栈的尾指针向栈底移动。方法执行完毕,需要释放这些空间,此时将栈的尾指针移项栈顶,完成栈的分配。

    iOS内存分区中栈的分区是高地址向地址扩容,生长方向向下,压栈的数据流程(栈指针指向栈空间的最高处,压栈的数据向低地址生长,栈的指针向下移动,出栈时,栈指针向高地址移动)
    回头来看,方法执行的栈的top指针移动,很多教程说栈尾指针移动,确切的说是栈尾的top指针向下移动。但是栈的结构中存在top和base指针。脑海中想到了一个倒立的矿泉水瓶子,表尾top指针在下面,移动和删除数据 申请释放内存空间

    相关文章

      网友评论

          本文标题:方法执行的压栈分析

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