【C/C++】关于函数约定回调

stdcall和cdecl是两种常见的函数调用约定。stdcall是WindowsAPI的标准,参数从右向左压栈,由被调用者清理栈。相比之下,cdecl在Linux中更常见,参数从左向右压栈,调用者负责清理。这两种约定各有优缺点,影响着函数调用的效率和兼容性。
摘要由CSDN通过智能技术生成

Windows

stdcall 调用约定与其他调用约定相比,具有以下几个特点:

参数传递方式:stdcall 调用约定规定了参数从右向左依次压入栈中,这种方式简单直接,易于实现和调试。而与之相比,cdecl 调用约定则是将参数从左向右依次压入栈中,这种方式更符合人类的思维习惯,但是会增加栈空间的分配和释放次数,从而降低函数调用的效率。

栈的清理方式:stdcall 调用约定规定了栈的清理方式,即由被调用函数负责清理栈空间,这种方式可以减少栈空间的分配和释放次数,从而提高函数调用的效率。而与之相比,fastcall 调用约定则是将前两个参数放在寄存器中,从而减少了栈空间的使用,但是会增加寄存器的使用次数,从而降低函数调用的效率。

返回值的处理方式:stdcall 调用约定规定了返回值的处理方式,即将返回值存放在 EAX 寄存器中,这种方式简单直接,易于实现和调试。而与之相比,fastcall 调用约定则是将返回值存放在寄存器中,从而减少了栈空间的使用,但是会增加寄存器的使用次数,从而降低函数调用的效率。

兼容性:stdcall 调用约定是 Windows 平台上的标准调用约定,许多 Windows API 函数都采用了这种调用约定,因此使用 stdcall 调用约定可以保证函数的兼容性和可移植性。而与之相比,其他调用约定可能会因为平台或编译器的不同而导致兼容性问题。

综上所述,stdcall 调用约定与其他调用约定相比,具有参数传递方式简单、函数调用效率高、返回值处理方式简单、兼容性好等优点,因此在 Windows 平台上,许多函数都采用了这种调用约定。

Linux

在 Linux 中,一般使用 cdecl 调用约定。cdecl 调用约定规定了参数从左向右依次压入栈中,由调用者负责清理栈空间。这种调用约定简单直接,易于实现和调试,因此被广泛应用于 Linux 系统中的函数调用。

与 cdecl 调用约定相比,Linux 中还有其他的调用约定,例如 stdcall、fastcall、thiscall 等。但是这些调用约定一般用于特定的编程语言或特定的平台,而在 Linux 中,由于历史原因和兼容性考虑,一般使用 cdecl 调用约定。

需要注意的是,在 Linux 中,函数调用约定是由编译器决定的,不同的编译器可能会采用不同的调用约定。因此,在编写跨平台的代码时,需要注意函数调用约定的兼容性问题,以确保代码的可移植性和兼容性。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值