我想知道哪一个负责清理堆栈
假设你有一个功能乐趣,可以这样说:
var = fun(int x, int y, float z, char x);
当fun
被调用时,它将与参数一起进入堆栈然后当函数返回负责清理堆栈的人是它自己的函数还是将保存的函数“var”返回值。
还有一件事,任何人都可以解释调用约定的概念吗?
答案 0 :(得分:9)
您自己提到了答案:调用约定。
调用约定类似于合同。它决定了以下几点:
根据平台和编程环境,有许多不同的调用约定。 x86平台上的两个常见调用约定是:
<强> STDCALL 强>
参数从右到左传递到堆栈。 调用函数清理堆栈。
<强> CDECL 强>
参数从右到左传递到堆栈。 调用函数清理堆栈。
在这两种情况下,返回值都在EAX
寄存器中(或ST0
表示浮点值)
x86平台的许多编程语言都允许指定调用约定,例如:
<强>的Delphi 强>
function MyFunc(x: Integer): Integer; stdcall;
Microsoft C / C ++
int __stdcall myFunc(int x)
一些使用说明:
创建一个简单的应用程序时,很少需要更改或了解调用约定,但有两种典型情况需要关注调用约定:
有关详细信息,我推荐这些维基百科文章:
答案 1 :(得分:5)
calling convention指的是谁正在清理堆栈;来电者或被叫者。
调用约定可能有所不同:
- 其中放置参数和返回值(在寄存器中;在调用中) 堆;两者的混合)
- 参数传递的顺序(或单个部分 参数)
- 如何划分设置和清理函数调用的任务 在来电者和被叫者之间。
- 有时也可以由被叫方直接使用的寄存器 包括在内
架构几乎总是有更多 比一种可能的召唤惯例。
答案 2 :(得分:0)
当行完成时,var将保存fun()返回的值,并且fun使用的堆栈上的任何内存都将消失:“push”,“pop”all tidy。
调用约定:编译器组织的所有内容,以便有趣地完成其工作。考虑那些参数x,y,z。它们被推入堆栈的顺序是什么(实际上它们是否通过堆栈传递)?只要来电者和被叫者同意就没关系!这是一个惯例。