C and C++ Calling Convention

本文详细介绍了C和C++中的调用约定,包括__cdecl, __stdcall, __fastcall, __thiscall, __clrcall和__vectorcall。这些约定涉及参数传递方式、堆栈清理、函数名修饰等方面,对于理解底层编程至关重要。" 125832093,7449817,C++模板基类成员调用技巧,"['C++', '模板', '继承']
摘要由CSDN通过智能技术生成

调用约定(Calling Convention) 是计算机编程中一个比较底层的设计,它主要涉及:

  • 函数参数通过寄存器传递还是栈?
  • 函数参数从左到右还是从右到左压栈?
  • 是否支持可变参数函数(vararg function or variadic function)。
  • 是否需要函数原型?
  • 调用者(caller)还是被调用者(called or callee)清理堆栈?

在C和C++中有几种调用约定:__cdecl, __stdcall, __fastcall, __thiscall, __clrcall, __vectorcall。下面对比下几种调用约定。

__cdecl

C Declaration Calling Convention,C声明调用约定。它是C和C++默认的调用约定。特点:

  • 堆栈由调用者清除(手动清除)。
  • 参数从右到左压栈。
  • 支持可变参数(函数自己并不知道自己有多少个参数,因此需要调用者来清除)。
  • 编译后函数名改编为:“_函数名”。如_funcname。

__stdcall

Standard Calling Convention,标准调用约定。特点:

  • 调用者清除堆栈。
  • 参数从右到坐压栈(和__cdecl一样),如果调用类的成员函数,最后压入this指针。
  • 需要一个函数原型,不支持变参函数。
  • 函数名改编:“_函数名@参数字节大小十进制”。如_funcname@8。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值