调用函数时实际发生的情况

时间:2019-12-27 15:48:11

标签: c++ function

我想进一步了解inline函数。问题是我不认为我了解“正常”功能的工作原理。有人可以解释:

  • 调用函数会发生什么?

enter image description here


上面的图片说明了我如何理解函数调用。当您调用它时,“线程将转到”函数(转到),将执行(处理),将返回(返回)。但是我不确定是正确的,而且我想知道在将线程主要传递给函数和执行该函数的函数之间发生了什么。模拟为另一种方式(返回)。

Here我发现了一些相关的东西。但是我不太了解。谢谢!

一次抽奖会有所帮助!

1 个答案:

答案 0 :(得分:3)

我的猜测是,您正在寻找比在Quora上阅读的解释更简单的解释。 这是给你的。

在数学中,函数f(X)X上的一系列转换集,它为您提供完全不同的输出(通常称为Y) 通常以数学方式描述函数。 例如,让函数f(X) = (8*X + 5) 因此,对于每个输入,都会有一个输出。 就像f(5)在计算中将是45。 在编程方面 45是返回值(Y

每当您尝试使用某个功能时,您都会调用该功能以获取特定的输入。

我可以详细介绍为什么当您调用多个函数时程序会变慢,但是在您提供的链接中对此进行了解释。因此,为了使事情简单,请想象一下,如果我要您计算一次简单的事情。您马上就可以做到。但是,如果我要您进行一千次简单的计算,尽管您会做,但仍会花费您很多时间。它与计算机并不完全相同,但是在某些地方。

有些函数实际上根本不返回任何东西。在Java中,它们被称为void函数。 为了理解这一点,让我们再举一个例子。 假设f()是您的函数,并使其在控制台输出5行。

现在,每当您尝试调用一个无效函数时,您都可以将其想像成用一个函数调用替换了这5条打印语句。

说现在需要输入f(X)并打印出X+18 由于它不返回任何内容,因此无法将f(X)分配给变量。但是它确实可以打印内容,因此无论何时在代码中调用它,它基本上只是执行将(X+18)打印到控制台的语句。 如果这还不够清楚,请说您为代码块定义了一个无效函数g(X)。 现在,无论何时调用它,您都可以考虑用该代码块替换g(X)

希望这会有所帮助

编辑: 看来您已经编辑了问题,因此为您提供了一个经过修改的答案。

现在,这是一个公正的警告-我要向您提供的解释不是技术性的。当我第一次向他们询问有关堆栈和功能的信息时,我的老师和我的一位同事为我使用了这种解释,所以这将是通俗易懂的。

想象一个巨大的容器(或盒子),我们称之为A 容器/盒子从顶部打开。 放在盒子里的任何物品由于重力都会落到底部。

假设您将项目B放在容器A内。然后添加C,然后添加D

由于该框仅从顶部打开,因此您输入的最后一个项目是唯一可以首先访问的项目。并且只有当您取出该项目时,您才能继续访问其下面的项目。因此,您首先可以访问D,然后取出D,就可以访问C,最后,当您取出C时,可以访问最低的项目B

容器A基本上是一个堆栈。 您可以将容器视为一盒内存(不是物理上的而是形象的),它基本上只是空闲的内存空间。

每当您调用main函数时,它就会被推入框内,或者像我们现在所说的那样被堆叠。 main( )函数现在位于堆栈的底部。您可以将其与上述示例中的项目B相关联。 现在假设您有一个函数f(X)main( )函数中,您正在调用f(5)

调用f(5)会为该函数创建一个新作用域,其中已将传入变量(X)的值设置为5

这整个过程-函数定义,在函数中创建的任何其他变量以及传入的变量的值-被称为“堆栈框架”。堆栈框架将占用我们的堆栈/容器中的一些空间。此堆栈框架还对应于容器中的下一个项目,并在主要方法上获得“ 已堆积”。您可以从上一个示例中将其视为C

现在我谈到了有关从容器/堆栈中删除项目的部分。删除对应于计算并返回值。考虑到void函数的存在,一个更好的术语是删除指的是函数的执行。需要删除的第一项是Cf(5),然后是Bmain( )

现在简单回答一下,为什么在调用许多函数时速度变慢。有一个简单的答案。您的容器没有无限的容量。

如果您继续用项目A填充容器B, C,这些项目显然将占据空间。最终,如果您继续添加项目D, E, F, G, H...,那么您的容器将充满时,这之后如果您尝试放入更多的项目,则容器将“溢出” 基本上,当您调用许多函数时,您的容器/堆栈会不断填充,最终导致堆栈溢出。

因此,调用函数会创建自己的作用域,并获取与该函数相关的所有信息(定义,传递的变量,其他变量等),将其放入堆栈框架中,然后堆栈该堆栈框架。

希望现在已经很清楚了...由于这个问题已经搁置,如果您仍然有疑问,可以随时发表另一条评论并在其中加上标签或以某种方式与我联系:)

PS:我在这里使用了很多外行语言来解释这一点,因此,使用它作为可视化正在发生的事情的通用方法,如果您正在为考试而学习它,则可以参考技术定义

编辑我已经将其编辑为一个仅具有单个功能f(5)的示例,因此可以更轻松地理解我的意思。较早的那个也不正确