谁负责清理?

Arp*_*pit 2 c compiler-construction callstack system

我想知道哪一个负责清理堆栈

假设你有一个功能乐趣,让我们这样说:

var = fun(int x, int y, float z, char x);
Run Code Online (Sandbox Code Playgroud)

何时fun被调用它将与参数一起进入堆栈然后当函数返回负责清理堆栈的人是它自己的函数还是将保存返回值的"var".

还有一件事,任何人都可以解释调用约定的概念吗?

Dan*_*ski 9

你自己提到了答案:调用约定.

调用约定类似于契约.它决定了以下几点:

  • 谁负责清理参数.
  • 参数如何以及以何种顺序传递给被调用函数.
  • 存储返回值的位置.

根据平台和编程环境,有许多不同的调用约定.x86平台上的两个常见调用约定是:

STDCALL

参数从右到左传递到堆栈.被调用的函数清理堆栈.

CDECL

参数从右到左传递到堆栈.在调用函数清理堆栈.

在这两种情况下,返回值都在EAX寄存器中(或ST0浮点值)

x86平台的许多编程语言都允许指定调用约定,例如:

德尔福

function MyFunc(x: Integer): Integer; stdcall;
Run Code Online (Sandbox Code Playgroud)

Microsoft C/C++

int __stdcall myFunc(int x)
Run Code Online (Sandbox Code Playgroud)

一些使用说明:

在创建一个简单的应用程序时,很少需要更改或了解调用约定,但有两种典型情况需要关注调用约定:

  • 在调用外部库时,例如Win32 API:您必须使用兼容的调用约定,否则堆栈可能会损坏.
  • 创建内联汇编程序代码时:您必须知道哪些寄存器以及堆栈中的哪个位置可以找到变量.

有关详细信息,我推荐这些维基百科文章:


Mit*_*eat 5

调用约定是指谁正在清理堆栈; 来电者或被叫者.

调用约定可能有所不同:

  • 其中放置参数和返回值(在寄存器中;在调用堆栈上;两者的混合)
  • 传递参数的顺序(或单个参数的一部分)
  • 如何在呼叫者和被呼叫者之间划分设置和清理函数调用的任务.
  • 有时也可以包括被调用者可以直接使用的寄存器

架构几乎总是有多个可能的调用约定.