我已经看到的 fastcall 符号所附之前的许多职能。为什么使用的?

有帮助吗?

解决方案

那个符号之前的功能是所谓的"呼吁《公约》。" 它规定了如何(在较低的水平)编译器将通过输入参数的功能和检索其结果,一旦它被执行。

有许多不同的调用各项公约,最受欢迎的是 stdcallcdecl.

你可能觉得只有一种方式这样做,但在现实中,有几十种,你可以叫一个功能,并通过变量。你可以地方的输入参数的上一堆(推,推,推动对话;弹,弹出,流行阅读的输入参数)。或者,也许你会而不是坚持他们在寄存器(这是 fastcall -它试图以适合某些输入参数在寄存器的速度)。

但后来怎么样了?你把他们从左到右或从右到左边?怎么样的结果还是只有一个(假设没有基准参数),这样做将导致在该堆中,在一个登记册,在某些存储的地址吗?

此外,让我们假设你使用堆通信的-谁是工作的是它的实际清除堆之后功能是所谓的呼叫者或被叫?

什么关于备份和随后的恢复的内容(某些)CPU寄存器-应该叫做到这一点,或将被叫方保证,它将回一切的方式吗?

最受欢迎的呼吁《公约》(到目前为止)是 cdecl, ,这是标准的呼吁《公约》在两C和C++。WIN32API使用 stdcall, ,这意味着任何代码,电话WIN32API需要使用 stdcall 对于这些功能的呼吁(它的另一个受欢迎的选择)。

fastcall 是一个有点古怪-人们意识到对于许多职能只有一个入/输出参数,推动和出现,从一个基于内存栈是相当多的开销和使功能的电话有点重所以不同的汇编者介绍了(不同)呼吁公约,将一个或多个参数,在注册之前,把其余的在栈有更好的表现。问题是,不是所有编译器使用的相同的规则为什么去哪和谁做什么用 fastcall, ,结果你必须小心使用它,因为你永远不知道谁做什么。最后,请参阅 是真的快速调更快? 的信息 fastcall 表现的好处。

复杂的东西。

一些重要的事情,请记住:不要增加或更改呼吁各项公约如果你不知道 到底 你在做什么,因为如果两者的呼叫者和被呼叫者不同意上呼吁《公约》,则有可能结束与堆腐败和一个出现段错误.这通常发生在你有功能在所谓的在DLL/公共图书馆及一个程序被编写的,取决于DLL/SO/dylib正在一定叫《公约》(说 cdecl),然后在图书馆被重新编译有一个不同的电话公约》(说 fastcall).现在的旧应用程序可以不再与新的图书馆。

其他提示

维基百科指出

授权FastCall的约定尚未标准化,并且已根据编译器供应商进行不同的实施方式。通常,FastCall调用约定通过寄存器中的一个或多个参数,该参数减少了呼叫所需的内存访问数量。

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top