代码之家  ›  专栏  ›  技术社区  ›  Zylon D. Lite

被调用的函数究竟什么时候结束?

  •  1
  • Zylon D. Lite  · 技术社区  · 8 年前

    我在读的一本教科书中说,对于具有返回值的函数,返回值用于在调用站点初始化临时值。

    我想知道的是这会发生吗 之后 被调用函数退出?换句话说,如果我有一个变量(比如 int )在被调用函数中定义,它是在初始化临时函数之前还是之后被销毁?

    3 回复  |  直到 8 年前
        1
  •  3
  •   cmaster - reinstate monica    8 年前

    这是技术观点。这对语言律师来说可能并不有趣,但对其他人来说,可能会对我有启发。


    函数以将控制权转移回调用方的分支指令精确结束。在这一点之前,被调用者拥有完全控制权,在这一点之后,调用者拥有对CPU所做事情的完全控制权。通常,只有一条CPU指令用于此控制传输。在X86-64上,这是 ret 说明,使用PowerPC blr ,其他CPU对同一事物有其他名称。不过,名字并不重要。

    函数本身负责的任何事情都必须在该指令之前发生,与被调用方无关的任何事情都必须发生在其他地方。

    由于调用方不知道函数创建了哪些变量,因此调用方不能负责销毁这些变量。更一般地说,被调用方必须释放为其自身目的分配的任何堆栈空间。因此,被调用方必须在退出之前通过发出 ret公司 指示这意味着,在函数退出之前,任何局部变量都必须消失。

    当涉及到从函数返回结果时,情况要复杂一些:这需要调用方和被调用方进行协作。不同调用约定的细节不同,但通常有两种情况:

    1. 返回值在寄存器中传递。
      在这种情况下,被调用方将返回值加载到一个已知的寄存器中,调用方将使用该寄存器访问返回值。

    2. 返回值在堆栈上传递。 在这种情况下,被调用方将把要返回的数据放在调用方堆栈框架内的定义位置,调用方将在调用返回后检查同一内存区域中的函数结果。

    TL;DR:如果某件事是函数的责任,那么它必须在函数返回(=执行 ret公司 说明)。释放堆栈空间并将数据返回给调用方就是这样的职责。

        2
  •  1
  •   Felix Glas    8 年前

    之前

    对于按值返回的函数,将初始化调用站点上的临时 之前 函数的范围退出。否则,任何返回值都将在传递到调用站点之前被销毁。

        3
  •  0
  •   Gautham Arunachalam    8 年前

    函数在返回语句后结束
    在该范围内声明的变量将超出范围,除非该变量声明为静态,否则您将无法使用该变量