数据结构概述
- 格式:doc
- 大小:68.50 KB
- 文档页数:14
Opentelemetry 数据结构Opentelemetry 是一个开源的观测性工具,用于收集、处理和导出分布式系统的遥测数据。
它提供了一组数据结构和API,用于跟踪应用程序的性能指标、日志和分布式追踪信息。
本文将详细介绍Opentelemetry的数据结构以及如何使用它们来实现应用程序的观测性。
1. 数据结构概述Opentelemetry定义了多个核心数据结构,包括:•Span: 代表一个操作或事件的单个实例。
它具有唯一标识符、起始时间、结束时间、持续时间等属性。
•Trace: 由一系列相关Span组成,表示一个完整的操作或请求。
Trace可以由多个Span组成一个树状结构。
•Context: 用于在跨越不同方法调用和线程之间传递Span和Trace信息的上下文对象。
•Attribute: 用于描述Span或Trace的附加信息,例如操作名称、错误信息等。
•Event: 表示在Span生命周期内发生的事件,例如日志记录、异常抛出等。
•Metric: 用于衡量应用程序的性能指标,例如响应时间、吞吐量等。
这些数据结构相互关联,并通过Opentelemetry API进行创建、访问和修改。
2. SpanSpan是Opentelemetry中最基本的数据结构,代表一个操作或事件的单个实例。
它包含以下属性:•Trace ID: Span所属Trace的唯一标识符。
•Span ID: Span自身的唯一标识符。
•Parent ID: 如果Span是另一个Span的子Span,则记录其父Span的ID。
•Name: Span的名称,通常是操作或事件的描述。
•Start Time: Span开始执行的时间戳。
•End Time: Span结束执行的时间戳。
•Duration: Span持续执行的时间。
Span还可以包含其他属性,称为Attributes,用于描述Span的附加信息。
例如:Span span = tracer.spanBuilder("operation").setAttribute("key1", "value1").setAttribute("key2", "value2").startSpan();3. TraceTrace由一系列相关Span组成,表示一个完整的操作或请求。
vulkan scene graph 数据结构讲解概述及解释说明1. 引言1.1 概述本文将详细介绍Vulkan 场景图(Scene Graph)的数据结构,并对其进行讲解和解释。
Vulkan 是一种跨平台的图形API,用于实现高性能的渲染和计算任务。
而场景图则是在游戏开发和虚拟现实等领域中广泛使用的一种数据结构,用于组织和管理场景中的对象和元素。
1.2 文章结构本文共分为五个部分进行讲解。
首先,在引言部分将对整篇文章进行概述,明确文章内容的目标与结构。
接着,在第二部分将介绍Vulkan 场景图的基础知识,包括其简介、场景图概念以及数据结构设计。
然后,在第三部分将深入解析Vulkan 场景图的实现细节,包括渲染流程分析、物体节点与视图节点关联机制以及场景更新与数据同步过程。
紧接着,在第四部分将分享使用Vulkan 场景图应用实践案例,其中包括如何利用该技术构建游戏场景、进行虚拟现实应用开发以及优化渲染性能的方法与策略。
最后,在第五部分对全文进行总结回顾,并展望研究方向,探讨对讨论结果的启示。
1.3 目的本文的目的在于给读者提供一个全面而深入的了解Vulkan 场景图数据结构的资料。
通过详细解析其实现细节和应用案例,读者可以更加清晰地认识到Vulkan 场景图在游戏开发和虚拟现实等领域中所起到的重要作用,以及如何利用场景图来优化渲染性能。
同时,本文还将展望未来研究方向,希望鼓励读者进一步探索和应用Vulkan 场景图技术。
2. Vulkan Scene Graph 数据结构讲解:2.1 简介:Vulkan Scene Graph(简称VSG)是一个用于构建实时渲染场景的数据结构库。
它基于Vulkan图形和计算API,并提供了一组高性能的数据结构和算法,用于管理和呈现3D场景中的对象、相机、灯光等元素。
2.2 场景图概念:在Vulkan Scene Graph中,整个场景被组织为一个图形图像,这个图形包含了一系列的节点。
vb6 数据结构【1.数据结构概述】数据结构是计算机科学中研究数据组织、存储、管理和访问的一门学科。
在编程中,数据结构用于实现特定功能,提高程序的效率和可读性。
VB6作为一种成熟的编程语言,提供了丰富的数据结构供开发者使用。
【2.VB6数据结构的使用】在VB6中,常用的数据结构有数组、链表、栈、队列、树、图等。
数组是VB6中最重要的数据结构之一,它允许在同一个变量名下存储多个相同类型的数据。
链表是另一种重要的数据结构,由一系列节点组成,每个节点包含数据和指向下一个节点的指针。
【3.常见数据结构及其应用】1.数组:适用于大量数据的存储和操作,如数值计算、字符串处理等。
2.链表:适用于动态数据存储和频繁的插入、删除操作,如列表框、树形控件等。
3.栈和队列:用于实现算法中的先进后出(LIFO)和先进先出(FIFO)策略,如计算表达式、解析文件等。
4.树和图:用于表示层次结构和复杂关系,如文件系统、社交网络等。
【4.实例:使用数组和链表实现人员管理】以下是一个使用数组和链表实现人员管理的简单示例:```vb" 定义员工类Class EmployeeProperty Name As StringProperty Age As IntegerProperty Gender As StringEnd Class" 定义员工管理类Class EmployeeManagerPrivate employeeArray As Employee()Private employeeList As New List(Of Employee)" 初始化员工数组Sub InitEmployeeArray(Size As Integer)Dim i As IntegerFor i = 0 To Size - 1employeeArray(i) = New EmployeeemployeeArray(i).Name = "员工" & i.ToStringemployeeArray(i).Age = i * 2employeeArray(i).Gender = If(i Mod 2 = 0, "男", "女") Next iEnd Sub" 添加员工到链表Sub AddEmployeeToList(employee As Employee)employeeList.Add(employee)End Sub" 删除链表中的员工Sub RemoveEmployeeFromList(employee As Employee)If employeeList.Contains(employee) ThenemployeeList.Remove(employee)End IfEnd Sub" 打印员工信息Sub PrintEmployeeInfo()For Each employee As Employee In employeeListConsole.WriteLine("姓名:" & & ",年龄:" & employee.Age & ",性别:" & employee.Gender)Next employeeEnd SubEnd Class" 创建员工管理对象并测试Dim employeeManager As New EmployeeManageremployeeManager.InitEmployeeArray(10)employeeManager.AddEmployeeT oList(New Employee With {.Name = "张三", .Age = 25, .Gender = "男"})employeeManager.PrintEmployeeInfo()```【5.总结与展望】VB6中的数据结构丰富多样,可以根据实际需求选择合适的数据结构来提高程序的效率和可读性。
K3总账数据数据结构K3总账数据数据结构之第一点:概述K3总账数据结构是指用友K3系统中用于存储和管理企业财务数据的数据模型。
它以数据库表的形式存在,包含了企业财务管理所需的各种信息,如凭证、账簿、报表等。
K3总账数据结构的设计合理性直接影响到企业财务管理的效率和准确性。
在K3总账数据结构中,主要包含了以下几个部分:1.基础信息:包括企业基本信息、科目信息、税率信息等,为企业的财务处理提供必要的参数和依据。
2.凭证信息:包括凭证头信息和凭证明细信息,记录了企业的每一笔经济业务的借贷方向、金额、日期等。
3.账簿信息:包括总账、明细账、日记账等,反映了企业财务状况的实时变化。
4.报表信息:包括资产负债表、利润表、现金流量表等,为企业决策提供了重要的财务数据支持。
K3总账数据结构的设计考虑了数据的一致性、完整性、安全性和可扩展性,以满足企业不断变化的财务管理需求。
K3总账数据结构之第二点:数据表详解在K3总账数据结构中,各个数据表的设计是关键。
以下是几个主要的数据表及其详解:1.科目表(account):用于存储企业所有的会计科目信息,包括科目编码、科目名称、科目类型、上级科目等。
2.凭证表(voucher):存储凭证的基本信息,如凭证编号、凭证日期、制单人、审核人、金额等。
3.凭证明细表(voucher_line):存储凭证的详细信息,如借方科目、贷方科目、金额、摘要等。
4.账簿表(account_book):存储账簿的汇总信息,如期末余额、累计发生额等。
5.报表表(report):存储各种财务报表的数据,如资产负债表、利润表等。
这些数据表通过外键关联,保证了数据的一致性和完整性。
同时,K3总账数据结构还提供了丰富的查询和统计功能,方便企业财务人员进行数据分析和决策。
以上就是对K3总账数据结构之第一点和第二点的详细解析。
希望对大家理解K3总账数据结构有所帮助。
K3总账数据结构之第三点:数据字段设计在K3总账系统中,每个数据表都包含了多个字段,用于存储具体的财务数据。
第一章数据结构概述基本概念与术语1.数据:数据是对客观事物的符号表示,在计算机科学中是指所有能输入到计算机中并被计算机程序所处理的符号的总称。
2。
数据元素:数据元素是数据的基本单位,是数据这个集合中的个体,也称之为元素,结点,顶点记录。
(补充:一个数据元素可由若干个数据项组成。
数据项是数据的不可分割的最小单位。
)3.数据对象:数据对象是具有相同性质的数据元素的集合,是数据的一个子集。
(有时候也叫做属性。
)4.数据结构:数据结构是相互之间存在一种或多种特定关系的数据元素的集合。
(1)数据的逻辑结构:数据的逻辑结构是指数据元素之间存在的固有逻辑关系,常称为数据结构。
数据的逻辑结构是从数据元素之间存在的逻辑关系上描述数据与数据的存储无关,是独立于计算机的。
依据数据元素之间的关系,可以把数据的逻辑结构分成以下几种:1.集合:数据中的数据元素之间除了“同属于一个集合“的关系以外,没有其他关系.2.线性结构:结构中的数据元素之间存在“一对一“的关系。
若结构为非空集合,则除了第一个元素之外,和最后一个元素之外,其他每个元素都只有一个直接前驱和一个直接后继。
3。
树形结构:结构中的数据元素之间存在“一对多“的关系.若数据为非空集,则除了第一个元素(根)之外,其它每个数据元素都只有一个直接前驱,以及多个或零个直接后继。
4.图状结构:结构中的数据元素存在“多对多"的关系.若结构为非空集,折每个数据可有多个(或零个)直接后继.(2)数据的存储结构:数据元素及其关系在计算机内的表示称为数据的存储结构。
想要计算机处理数据,就必须把数据的逻辑结构映射为数据的存储结构。
逻辑结构可以映射为以下两种存储结构:1.顺序存储结构:把逻辑上相邻的数据元素存储在物理位置也相邻的存储单元中,借助元素在存储器中的相对位置来表示数据之间的逻辑关系.2.链式存储结构:借助指针表达数据元素之间的逻辑关系。
不要求逻辑上相邻的数据元素物理位置上也相邻。
数据结构在现实生活中的应用数据结构在现实生活中的应用概述数据结构是计算机科学中重要的基础概念之一,它提供了一种有效地组织和管理数据的方式。
尽管它们最初是为计算机科学设计的,但数据结构的概念和方法在现实生活中也有广泛的应用。
本文将介绍一些常见的现实生活中使用数据结构的例子。
数组数组是最基本的数据结构之一,它是一个连续的、固定大小的存储元素的集合。
在现实生活中,我们经常使用数组来存储和管理一系列相关的数据。
例如,在商店的库存管理中,我们可以使用一个数组来存储每个商品的库存数量。
这样,当我们需要查询某个商品的库存数量时,只需要通过索引访问数组中的元素即可。
另外,数组还可以用于存储成绩在某个考试中的学生列表。
这样,我们可以根据学生的索引快速获取他们的成绩,并进行排序和统计。
链表链表是另一种常用的数据结构,它由一系列的节点组成,每个节点包含数据和指向下一个节点的引用。
链表在现实生活中的应用非常广泛。
一个常见的例子是方式通讯录。
我们可以使用链表来存储联系人的信息。
每个节点表示一个联系人,包含姓名、方式号码等信息,同时还包含指向下一个联系人的引用。
这样,我们可以通过遍历链表,轻松地查找、添加和删除联系人。
链表还可以在火车或地铁系统中使用。
每个节点表示一个站点,包含站点名称和到下一个站点所需的时间。
通过遍历链表,我们可以计算出从起点到终点的最短时间,并提供路线规划服务。
栈栈是一种具有特定的操作规则的数据结构,它遵循后进先出(LIFO)的原则。
在现实生活中,我们可以找到许多适合使用栈的场景。
一个典型的例子是浏览器的后退功能。
当我们浏览网页时,每访问一个页面,都将其存储在栈中。
当我们后退按钮时,栈中的顶部元素会被弹出,我们就可以返回到上一个页面。
另一个例子是函数调用的堆栈。
每当我们调用一个函数时,函数的信息将被存储在栈中。
当函数执行完毕后,这些信息会被弹出。
这使得函数之间的嵌套调用成为可能。
队列队列是一种遵循先进先出(FIFO)原则的数据结构,它经常被用来在现实生活中模拟排队的场景。
链码数据结构的特征码-回复链码是区块链技术中的一个重要组成部分,它用于定义和实现区块链网络中的智能合约。
链码数据结构是链码在区块链网络中存储和处理数据的方式,其特征码是用于描述链码数据结构的一组特征属性。
本文将以“链码数据结构的特征码”为主题,详细讨论链码数据结构的特征码及其重要性。
一、链码数据结构概述:链码数据结构是指在区块链网络中,链码用来存储和管理数据的方式和形式。
链码的数据结构通常由多个数据字段组成,这些字段用于存储不同类型的数据,例如账户余额、交易记录等。
二、链码数据结构的特征码的定义:链码数据结构的特征码是指用于描述链码数据结构的一组特征属性,通过这组特征码可以完整而准确地描述链码的数据结构。
特征码可以包括数据类型、数据长度、数据格式等信息。
三、链码数据结构的特征码的作用:特征码是链码数据结构的重要组成部分,它具有以下作用:1. 数据完整性验证:特征码可以用于验证数据的完整性,通过对特征码进行哈希计算,可以确保链码数据在传输过程中没有被篡改。
2. 数据存储和检索:特征码可以作为链码数据的索引,以便于对数据进行高效的存储和检索。
3. 数据共享和传输:特征码可以作为数据的摘要信息,方便链码数据在不同的节点之间共享和传输。
4. 数据安全性保护:特征码可以用于隐私保护,通过对敏感数据进行特征码加密,可以保护用户隐私。
四、链码数据结构的特征码的组成:1. 数据类型:特征码包括链码数据的类型信息,例如整数、字符串、布尔值等。
2. 数据长度:特征码包括链码数据的长度信息,例如字符串的长度、整数的位数等。
3. 数据格式:特征码包括链码数据的格式信息,例如日期的格式、金额的格式等。
五、链码数据结构的特征码的实例应用:1. 智能合约:特征码可以用于描述智能合约中的链码数据结构,以便于在执行智能合约时对数据进行验证和处理。
2. 账本管理:特征码可以用于描述账本中的链码数据结构,以便于对账本数据进行存储和检索。
第1篇一、引言随着计算机技术的飞速发展,数据结构作为计算机科学的核心课程之一,对于培养计算机专业人才具有至关重要的意义。
为了提高学生对数据结构理论知识的掌握程度,增强实际应用能力,我们开展了数据结构实训课程。
本报告将从实训背景、实训内容、实训过程、实训成果以及实训总结等方面进行概述。
二、实训背景1. 实训目的通过数据结构实训,使学生掌握数据结构的基本概念、基本原理和基本算法,提高学生的编程能力和问题解决能力,培养学生在实际工作中运用数据结构解决实际问题的能力。
2. 实训意义(1)加深对数据结构理论知识的理解;(2)提高编程能力和算法设计能力;(3)培养团队协作精神;(4)增强实际应用能力。
三、实训内容1. 理论知识学习(1)线性表、栈、队列、串等基本数据结构;(2)树、图等非线性数据结构;(3)排序、查找等基本算法;(4)数据结构在实际应用中的案例分析。
2. 编程实践(1)线性表:实现顺序表、链表等;(2)栈和队列:实现栈、队列等;(3)树和图:实现二叉树、图等;(4)排序和查找:实现冒泡排序、快速排序、二分查找等。
3. 项目实践(1)设计并实现一个简单的图书管理系统;(2)设计并实现一个简单的学生成绩管理系统;(3)设计并实现一个简单的员工管理系统。
四、实训过程1. 实训准备(1)组织学生进行数据结构理论知识学习;(2)安排编程实践项目,明确项目要求;(3)邀请相关领域专家进行讲座,分享实际应用经验。
2. 实训实施(1)学生分组,明确分工;(2)指导教师跟踪项目进度,及时解答学生疑问;(3)学生自主完成项目,互相交流学习;(4)定期进行项目汇报,展示项目成果。
3. 实训总结(1)组织学生进行实训成果展示;(2)邀请专家对项目进行评审;(3)总结实训过程中的优点和不足,提出改进措施。
五、实训成果1. 学生掌握了数据结构的基本概念、基本原理和基本算法;2. 学生的编程能力和问题解决能力得到提高;3. 学生能够运用数据结构解决实际问题的能力得到增强;4. 学生在实训过程中培养了团队协作精神。
数据结构资料 - 1 - 教材:《数据结构》 严蔚敏 吴伟民 清华大学出版社
《数据结构算法实现及解析》 高一凡 西安电子科技大学出版社 第一部分 数据结构概述 一、定义(研究是数据结构的存储和数据的操作的) 如何把现实中大量而复杂的问题以特定的数据类型和特定的存储结构保存到主存储器(内存)中,以及在此基础上为实现某个功能(比如查找某个元素,删除某个元素,对所有元素进行排序)而执行的相应操作,这个相应的操作也叫做算法。 数据结构 = 个体的存储(从某个角度而言,可忽略) + 个体与个体之间关系的存储(核心) 算法 = 对存储数据的操作 二、算法 解题的方法和步骤 衡量算法的标准 1.时间复杂度 大概程序要执行的次数,而非执行的时间 2.空间复杂度 算法执行过程中大概所占用的最大内存 3.难易程度(即可读性) 4.健壮性 三、数据结构的地位 数据结构是软件中最核心的内容 程序 = 数据的存储 + 数据的操作 + 可以被计算机执行的语言 第二部分 预备知识 一、指针 数据结构资料 - 2 - 指针的重要性:指针是C语言的灵魂
定义 地址:内存单元的编号 从零开始的非负整数 范围:0--FFFFFFFF(即0--4G-1) 指针: 指针就是地址,地址就是指针 指针变量是存放内存单元地址的变量 指针的本质是一个操作受限的非负整数(只能进行减运算) 分类: 1.基本类型的指针 2.指针和一维数组的关系 二、结构体 为什么会出现结构体 为了表示一些复杂的数据,而普通的基本类型变量无法满足要求 什么叫结构体 结构体是用户根据实际需要自己定义的数据类型 如何使用结构体 两种方式: struct Student st = {1000, "zhangsan", 20} struct Student * pst = &st; 1.st.sid 2.pst->sid pst所指向的结构体变量中的sid这个成员 数据结构资料 - 3 - 注意事项
结构体变量不能加减乘除,但可以相互赋值 普通结构体变量和结构体指针变量作为函数传参问题 三、动态内存的分配和释放 假设动态构造一个int型的一位数组 int len; int * pArr = (int *)malloc (sizeof(int) * len); ①本语句分配了两块内存,一块内存是动态分配的,总共len个字节;另一块是静态分配的,是pArr变量本身所占的内存,总共4个字节。 ②malloc只有一个int型的形参,表示要求系统分配的字节数 ③malloc函数的功能是请求系统分配len个字节的内存空间,如果分配成功,则返回第一个字节的地址,如果分配不成功,则返回NULL ④malloc函数能且只能返回第一个字节的地址,所以我们需要把这个无任何实际意义的第一个字节的地址(俗称干地址)转化为一个有实际意义的地址,因此,malloc函数前面必须加强制类型转换(数据类型 *),表示把这个无实际意义的第一个字节的地址转化为相应类型的地址。 ⑤free(* pArr) 表示把pArr所指向的内存给释放掉 pArr本身的内存是静态的,不能有程序员手动释放,只能在pArr变量所在的函数运行终止时有系统自动释放 ⑥跨函数使用内存 静态内存不可以跨函数使用: 静态内存在函数执行期间可以被其它函数使用 静态内存在函数执行完毕之后就不能在被其它函数使用 数据结构资料 - 4 - 动态内存可以跨函数使用
动态内存在函数执行完毕之后仍然可以被其它函数使用 第三部分 模块一:线性结构 [把所有的结点用一条直线穿起来] 一、连续存储[数组] 1.什么叫做数组 元素类型相同,大小相等 2.数组的优缺点(相对于链表) 优点:存取速度快 缺点:实现必须知道数组的长度 需要大块连续的内存块 插入和删除元素很慢 空间通常是有限制的 二、离散存储[链表] 1.定义 N个结点离散分配 彼此通过指针相连 每个结点只有一个前驱结点,每个结点只有一个后续结点 首结点没有前驱结点,尾结点没有后续结点 专业术语: 首结点:第一个存放有效数据的结点 尾结点:最有一个存放有效数据的结点 头结点:头结点的数据类型和首结点的类型是一样的 首结点之前的结点 头结点并不存放有效数据 数据结构资料 - 5 - 加头结点的目的是为了方便对链表的操作
头指针:指向头结点的指针变量 尾指针:指向尾结点的指针变量 确定一个链表需要几个参数: (如果希望通过一个函数来对链表进行处理,我们至少需要接受链表的那些参数) 一个参数,即头指针,因为我们通过头指针可以推算出链表的其它所有的信息 2.分类 单链表 双链表:每一个结点有两个指针域
循环链表:能通过任何一个结点找到其它所有的结点 非循环链表 3.算法 遍历 / 查找 / 清空 / 销毁 / 求长度 / 排序 / 删除结点 / 插入结点 插入结点:(伪算法) ① r = p->pNext; p->pNext = q; q->pNext = r; ② q->pNext = p->pNext; p->pNext = q;(这两行代码不能倒过来) 删除结点:(伪算法) r = p->pNext; p->pNext = p->pNext->pNext; free(r); 狭义的算法是与数据的存储方式密切相关 广义的算法是与数据的存储方式无关 泛型: 利用某种技术达到的效果就是:不同的存储方式,执行的操作是一样的 数据结构资料 - 6 - 同一种逻辑结构(包括线性结构和非线性结构,其中非线性结构包括树和
图),无论该逻辑结构物理存储(包括数组和链表)是什么样子的,我们都可以对它执行相同的操作 4.链表的优缺点(相对于数组) 优点:空间没有限制 插入和删除元素很快 缺点:存取的速度很慢 三、线性结构的两种常见应用之一 栈 1.定义:一种可以实现“先进后出”的存储结构 栈类似于箱子 2.分类 静态栈:以数组为内核 动态栈:以链表为内核 3.算法 出栈 / 入栈 4.应用 函数调用 / 中断 / 表达式求值 /内存分配 / 缓冲处理 / 迷宫 四、线性结构的两种常见应用之一 队列 1.定义:一种可以实现“先进先出”的存储结构 队列类似于排队买票 2.分类 链式队列 ---- 用链表实现 静态队列 ---- 用数组实现 静态队列通常都必须是循环队列 数据结构资料 - 7 - 循环队列的讲解:
①静态队列为什么必须是循环队列 普通队列的参数front和rear只增不减,导致内存浪费 ②循环队列需要几个参数来确定 需要两个参数:front / rear ③循环队列各个参数的含义 两个参数在不同的场合有不同的含义 ①队列初始化 front 和 rear 的值都为零 ②队列非空 front 代表的是队列的第一个元素 rear 代表的是队列的最后一个有效元素的下一个元素 ③队列空 front 和rear 的值相等,但不一定是零 ④循环队列入队伪算法讲解(在尾部入队) 第一步:将值存入rear所指向的位置 第二步:rear = (rear + 1)%数组的长度 ⑤循环队列出队伪算法讲解(在头部出队) front = (front +1)%数组的长度 ⑥如何判断循环队列为空 如果front 与rear的值相等,则该队列一定为空 ⑦如何判断循环队列为满 第一种方法:多增加一个标识参数,即数组的长度 (常用)第二种方法:少用一个元素,如果front == (rear + 1)%数组的长度,则数据结构资料 - 8 - 循环队列已满
3.算法 出队 / 入队 4.应用 所有和时间有关的操作都有队列的影子 五、专题:递归(使用栈实现的) 1、定义:一个函数自己直接或间接调用自己 2、函数的调用 当在一个函数的运行期间调用另一个函数时,在运行被调函数之前,系统需要完成三件事: a、将所有的实际参数、返回地址等信息传递给被调函数保存 b、为被调函数的局部变量(包括形参)分配存储空间 c、将控制转移到被调函数的入口 从被调函数返回主调函数之前,系统也要完成三件事: a、保存被调函数返回结果 b、释放被调函数所占的存储空间 c、依照被调函数保存的返回地址将控制转移到调用函数 当有多个函数相互调用时,按照“后调用先返回”的原则,上述函数之间的信息传递和控制转移必须借助“栈”来实现,即系统将整个程序运行时所需的数据空间安排在一个栈中,每当调用一个函数时,就在栈顶分配一个存储区,进行压栈操作;每当一个函数退出时,就释放它的存储区,进行出栈操作,当前运行的函数永远都在栈顶位置。 A函数调用A函数与A函数调用B函数在计算机看来是没有任何区别的,只不过用我们日常的思维方式理解比较怪异而已。