谁负责清理?

时间:2009-09-22 07:02:04

标签: c compiler-construction system callstack

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

假设你有一个功能乐趣,可以这样说:

var = fun(int x, int y, float z, char x);

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

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

3 个答案:

答案 0 :(得分:9)

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

调用约定类似于合同。它决定了以下几点:

  • 谁负责清理参数。
  • 参数传递给被调用函数的方式和顺序。
  • 存储返回值的位置。

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

  

<强> STDCALL

     

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

     

<强> CDECL

     

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

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

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

  

<强>的Delphi

function MyFunc(x: Integer): Integer; stdcall;
     

Microsoft C / C ++

int __stdcall myFunc(int x)

一些使用说明:

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

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

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

答案 1 :(得分:5)

calling convention指的是谁正在清理堆栈;来电者或被叫者。

  

调用约定可能有所不同:

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

架构几乎总是有更多   比一种可能的召唤惯例。

答案 2 :(得分:0)

当行完成时,var将保存fun()返回的值,并且fun使用的堆栈上的任何内存都将消失:“push”,“pop”all tidy。

调用约定:编译器组织的所有内容,以便有趣地完成其工作。考虑那些参数x,y,z。它们被推入堆栈的顺序是什么(实际上它们是否通过堆栈传递)?只要来电者和被叫者同意就没关系!这是一个惯例。