问题标签 [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.
c - 快速调用 GCC 示例
有人可以提供一个用于 gcc 的 fastcall 示例吗?如果可能,您能否在不使用 fastcall 的情况下提供等效调用并解释它们有何不同?
c++ - fastcall真的更快吗?
fastcall 调用约定真的比 cdecl 等其他调用约定快吗?是否有任何基准可以显示调用约定如何影响性能?
visual-c++ - Visual c 中使用的 fastcall 关键字是什么?
我已经看到fastcall
在许多函数之前附加的符号。为什么使用它?
c - “内联”函数与“fastcall”调用约定的性能影响
我有一个 CRC 计算函数,它以极高的频率被调用。我已经宣布,因为inline
我试图让它成为一个__attribute((hot))__
,但我不确定这是否能买到任何东西。我正在考虑把它做成一个fastcall
.
根据gcc 文档,
fastcall 在 Intel 386 上,fastcall 属性使编译器在寄存器 ECX 中传递第一个参数(如果是整数类型),在寄存器 EDX 中传递第二个参数(如果是整数类型)。随后的和其他类型的参数在堆栈上传递。被调用的函数将从堆栈中弹出参数。如果参数的数量是可变的,则所有参数都被压入堆栈。
fastcall
将使它本质上更快,因为输入参数将通过寄存器发送,而不是将它们推入堆栈。使用inline
,编译器将用函数体替换函数调用。
所以问题是fastcall
当使用时是否inline
有意义?
unix - 64位快速调用
我一直在阅读 32 位调用约定的差异。与磨难就是fastcall
。stdcall
根据我的阅读,这两种约定存在很大的混淆,并且 64 位被标准化以避免这种混淆。
我不得不问,为什么被fastcall
选中?
另外,既然fastcall
andstdcall
是 win32 术语,那么 UNIX 术语中表示使用或不使用寄存器来传递参数的函数调用是什么?
assembly - MASM x86 fastcall 函数声明...怎么样?
我正在尝试让 VisualStudio 2010 C 程序调用 fastcall 约定汇编例程。
这是 C 代码中的声明:
这是汇编代码中的声明:
我收到以下链接器错误:
我确定我在做一些愚蠢的错误,但我看不到它。
MS文档很难弄清楚,因为它太模糊了。我记得在过去的迷雾中,汇编器也进行了一些名称修改,所以我不确定我提供的名称是如何被修改的,如果是的话。
这是关于如何做的最明确的参考,我认为我完全遵循它;它说,
有什么线索吗?
谢谢...
c++ - 为什么我不应该使用 __fastcall 而不是标准的 __cdecl?
我会听一些人说它比其他调用__fastcall
更快__cdecl
,__stdcall
因为它将两个参数放入寄存器,而不是其他调用之一;但是,另一方面,这不是 C 中使用的标准。
我想知道是什么让__fastcall
C 中的标准变得不受欢迎,以及何时在我的代码中使用它。
c - C手动调用带有堆栈和寄存器的函数
我知道这是操纵堆栈的大事,但我认为这对我来说将是一个很好的教训。我搜索了互联网,我发现了调用约定。我知道它是如何工作的以及为什么。我想模拟一些“被调用者清理堆栈”可能是stdcall,fastcall没关系,重要的是谁清理堆栈,那么我将有更少的工作要做:)
例如。我在 C 中有函数
会是凯莉
我有指向这个函数的指针,类型为 void*,
我有函数调用者
就是这样,当我使用调用约定“Calle clean-up”时它很有帮助,因为我不需要
我不知道该怎么做,我知道它可以用汇编程序来完成。但我害怕它,我从不“接触”这种语言。我会很高兴用 C 模拟那个调用,但是当任何人都可以用 ASM 做它时,我会很高兴 :)
我还告诉了我想用它做什么,当我知道如何手动调用函数时,我将能够使用多个参数(如果我知道它的数量和大小)和任何类型的函数来调用函数。因此,当该函数符合正确的调用约定时,我将能够以任何语言调用任何函数。
我正在使用 Windows OS x64 和 MinGw
c++ - 对于 Windows 程序的调用约定,声明什么更好?
我读过一篇关于Calling convention
(__stdcall、__fastcall、pascal、cdecl 等...)的文章
我想知道:为什么经常为 WinMain() 函数声明 __stdcall (WinAPI)?
正如我所读到的,使用__stdcall
堆栈__fastcall
进行操作,对寄存器进行操作,根本不使用堆栈。
所以,我试图用. __fastcall
编译器(Visual C++)给了我一个错误。
为什么我不能__fastcall
用于 WinMain() 并且有可能使用它吗?
因为在不使用堆栈的情况下处理寄存器要快得多,不是吗?
PS我的建议是,有一些方法合同不允许我使用__fastcall
,但这只是我的建议。
x86 - 为什么 x86 上的 MS fastcall 不使用 EAX 作为第一个参数?
根据维基百科:“微软或 GCC __fastcall 约定(又名 __msfastcall)传递适合 ECX 和 EDX 的前两个参数(从左到右评估)。剩余的参数从右到左推入堆栈。”
为什么他们决定不对 arg0、arg1、arg2 使用 EAX、ECX、EDX?如果他们要将参数推入寄存器,为什么要停在 2 处?我知道Borland 的fast all 可以做到这一点,那么微软选择不使用EAX 只是为了与众不同吗?