gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-04 04:53:43 26 4
gpt4 key购买 nike

我见过fastcall在许多函数之前附加符号。为什么使用它?

最佳答案

函数前的符号称为“调用约定”。它指定编译器如何(在低级别)将输入参数传递给函数并在执行后检索其结果。

有许多不同的调用约定,最流行的是 stdcallcdecl .

您可能认为只有一种方法可以做到这一点,但实际上,您可以通过多种方式调用函数并将变量传入和传出。您可以将输入参数放在堆栈上(推、推、推调用;弹出、弹出、弹出以读取输入参数)。或者,您可能更愿意将它们放在寄存器中(这是 fastcall - 它试图将一些输入参数放入寄存器以提高速度)。

但是订单呢?你是从左到右还是从右到左插入它们?结果怎么样 - 总是只有一个(假设没有引用参数),那么你是否将结果放在堆栈上,在寄存器中,在某个内存地址?

此外,让我们假设您正在使用堆栈进行通信 - 谁的工作是在调​​用函数后实际清除堆栈 - 调用者还是被调用者?

如何备份然后恢复(某些)CPU 寄存器的内容 - 调用者应该这样做,还是被调用者保证它会按原样返回所有内容?

最流行的调用约定(到目前为止)是 cdecl ,这是 C 和 C++ 中的标准调用约定。 WIN32 API 使用 stdcall ,这意味着任何调用 WIN32 API 的代码都需要使用 stdcall对于那些函数调用(使其成为另一个流行的选择)。
fastcall有点奇怪 - 人们意识到只有一个输入/输出参数的许多函数,从基于内存的堆栈中插入和弹出是相当多的开销,并且使函数调用有点重,因此引入了不同的编译器(不同的) 调用约定将一个或多个参数放入寄存器,然后将其余参数放入堆栈以获得更好的性能。问题是,并非所有编译器都使用相同的规则来处理 fastcall ,因此您在使用它时必须小心,因为您永远不知道谁在做什么。最后看Is fastcall really faster?有关 fastcall 的信息性能优势。

复杂的东西。

需要记住的重要事项:如果您不确切知道自己在做什么,请不要添加或更改调用约定,因为如果调用方和被调用方都不同意调用约定,您很可能最终会堆栈损坏和段错误。这通常发生在您在 DLL/共享库中调用函数并且编写的程序依赖于 DLL/SO/dylib 是某个调用约定(例如, cdecl ),然后使用不同的调用约定(例如, fastcall )。现在旧程序无法再与新库通信。

关于visual-c++ - Visual c 中使用的 fastcall 关键字是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10671281/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com