问题标签 [fastcall]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
2 回答
15975 浏览

c - 快速调用 GCC 示例

有人可以提供一个用于 gcc 的 fastcall 示例吗?如果可能,您能否在不使用 fastcall 的情况下提供等效调用并解释它们有何不同?

0 投票
4 回答
12108 浏览

c++ - fastcall真的更快吗?

fastcall 调用约定真的比 cdecl 等其他调用约定快吗?是否有任何基准可以显示调用约定如何影响性能?

0 投票
2 回答
4221 浏览

visual-c++ - Visual c 中使用的 fastcall 关键字是什么?

我已经看到fastcall在许多函数之前附加的符号。为什么使用它?

0 投票
1 回答
654 浏览

c - “内联”函数与“fastcall”调用约定的性能影响

我有一个 CRC 计算函数,它以极高的频率被调用。我已经宣布,因为inline我试图让它成为一个__attribute((hot))__,但我不确定这是否能买到任何东西。我正在考虑把它做成一个fastcall.

根据gcc 文档

fastcall 在 Intel 386 上,fastcall 属性使编译器在寄存器 ECX 中传递第一个参数(如果是整数类型),在寄存器 EDX 中传递第二个参数(如果是整数类型)。随后的和其他类型的参数在堆栈上传递。被调用的函数将从堆栈中弹出参数。如果参数的数量是可变的,则所有参数都被压入堆栈。

fastcall将使它本质上更快,因为输入参数将通过寄存器发送,而不是将它们推入堆栈。使用inline,编译器将用函数体替换函数调用。

所以问题是fastcall当使用时是否inline有意义?

0 投票
1 回答
2964 浏览

unix - 64位快速调用

我一直在阅读 32 位调用约定的差异。与磨难就是fastcallstdcall

根据我的阅读,这两种约定存在很大的混淆,并且 64 位被标准化以避免这种混淆。

我不得不问,为什么被fastcall选中?

另外,既然fastcallandstdcall是 win32 术语,那么 UNIX 术语中表示使用或不使用寄存器来传递参数的函数调用是什么?

0 投票
2 回答
2079 浏览

assembly - MASM x86 fastcall 函数声明...怎么样?

我正在尝试让 VisualStudio 2010 C 程序调用 fastcall 约定汇编例程。

这是 C 代码中的声明:

这是汇编代码中的声明:

我收到以下链接器错误:

我确定我在做一些愚蠢的错误,但我看不到它。

MS文档很难弄清楚,因为它太模糊了。我记得在过去的迷雾中,汇编器也进行了一些名称修改,所以我不确定我提供的名称是如何被修改的,如果是的话。

这是关于如何做的最明确的参考,我认为我完全遵循它;它说,

有什么线索吗?

谢谢...

0 投票
2 回答
4791 浏览

c++ - 为什么我不应该使用 __fastcall 而不是标准的 __cdecl?

我会听一些人说它比其他调用__fastcall更快__cdecl__stdcall因为它将两个参数放入寄存器,而不是其他调用之一;但是,另一方面,这不是 C 中使用的标准。

我想知道是什么让__fastcallC 中的标准变得不受欢迎,以及何时在我的代码中使用它。

0 投票
1 回答
2231 浏览

c - C手动调用带有堆栈和寄存器的函数

我知道这是操纵堆栈的大事,但我认为这对我来说将是一个很好的教训。我搜索了互联网,我发现了调用约定。我知道它是如何工作的以及为什么。我想模拟一些“被调用者清理堆栈”可能是stdcall,fastcall没关系,重要的是谁清理堆栈,那么我将有更少的工作要做:)

例如。我在 C 中有函数

会是凯莉

我有指向这个函数的指针,类型为 void*,

我有函数调用者

就是这样,当我使用调用约定“Calle clean-up”时它很有帮助,因为我不需要

我不知道该怎么做,我知道它可以用汇编程序来完成。但我害怕它,我从不“接触”这种语言。我会很高兴用 C 模拟那个调用,但是当任何人都可以用 ASM 做它时,我会很高兴 :)

我还告诉了我想用它做什么,当我知道如何手动调用函数时,我将能够使用多个参数(如果我知道它的数量和大小)和任何类型的函数来调用函数。因此,当该函数符合正确的调用约定时,我将能够以任何语言调用任何函数。

我正在使用 Windows OS x64 和 MinGw

0 投票
2 回答
415 浏览

c++ - 对于 Windows 程序的调用约定,声明什么更好?

我读过一篇关于Calling convention(__stdcall、__fastcall、pascal、cdecl 等...)的文章

我想知道:为什么经常为 WinMain() 函数声明 __stdcall (WinAPI)?

正如我所读到的,使用__stdcall堆栈__fastcall进行操作,对寄存器进行操作,根本不使用堆栈。

所以,我试图. __fastcall编译器(Visual C++)给了我一个错误。

为什么我不能__fastcall用于 WinMain() 并且有可能使用它吗?

因为在不使用堆栈的情况下处理寄存器要快得多,不是吗?

PS我的建议是,有一些方法合同不允许我使用__fastcall,但这只是我的建议。

0 投票
1 回答
548 浏览

x86 - 为什么 x86 上的 MS fastcall 不使用 EAX 作为第一个参数?

根据维基百科:“微软或 GCC __fastcall 约定(又名 __msfastcall)传递适合 ECX 和 EDX 的前两个参数(从左到右评估)。剩余的参数从右到左推入堆栈。”

为什么他们决定不对 arg0、arg1、arg2 使用 EAX、ECX、EDX?如果他们要将参数推入寄存器,为什么要停在 2 处?我知道Borland 的fast all 可以做到这一点,那么微软选择不使用EAX 只是为了与众不同吗?