__stdcall 与 __cdecl 区别

__stdcall和__cdecl是C++中的两种函数调用约定,主要区别在于参数压栈方向和清理堆栈的责任方。__stdcall由被调用函数清理堆栈,常用于Windows API;__cdecl由调用者清理,是C和C++的默认约定。函数名修饰上,__stdcall前加下划线和参数字节数,__cdecl只加下划线。
摘要由CSDN通过智能技术生成

__cdecl

C++

void fun(int a)   //默认__cdecl
{
 cout << a;
}

int main()
{
 fun(3);
 system("pause");
 return 0;
}

 

反汇编:

void fun(int a)
{
00D713A0  push        ebp 
00D713A1  mov         ebp,esp 
00D713A3  sub         esp,0C0h 
00D713A9  push        ebx 
00D713AA  push        esi 
00D713AB  push        edi 
00D713AC  lea         edi,[ebp-0C0h] 
00D713B2  mov         ecx,30h 
00D713B7  mov         eax,0CCCCCCCCh 
00D713BC  rep stos    dword ptr es:[edi] 
 cout << a;
00D713BE  mov         esi,esp 
00D713C0  mov         eax,dword ptr [a] 
00D713C3  push        eax 
00D713C4  mov         ecx,dword ptr [__imp_std::cout (0D78294h)] 
00D713CA  call        dword ptr [__imp_std::basic_ostream<char,std::char_traits<char> >::operator<< (0D78290h)] 
00D713D0  cmp         esi,esp 
00D713D2  call        @ILT+305(__RTC_CheckEsp) (0D71136h) 
}
00D713D7  pop         edi 
00D713D8  pop         esi 
00D713D9  pop         ebx 
00D713DA  add         esp,0C0h 
00D713E0  cmp         ebp,esp 
00D713E2  call        @ILT+305(__RTC_CheckEsp) (0D71136h) 
00D713E7  mov         esp,ebp 
00D713E9  pop         ebp 
00D713EA  ret 

 

//main中调用fun

 fun(3);
0005141E  push        3 
00051420  call        fun (511D1h) 
00051425  add         esp,4 

 

__cdecl :由调用者清堆栈

 

 

_

  • 0
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
__cdecl 和 __stdcall 都是 C/C++ 函数调用的约定,用于指明函数参数的传递方式和堆栈的清理方式。它们的主要区别在于参数传递的顺序、堆栈的清理方式和函数调用的速度。 __cdecl 是默认的调用约定,参数从右往左依次压入堆栈,由调用方清理堆栈。这意味着参数的顺序是反向的,而且每次函数调用后都需要调用方清理堆栈。例如: ```c++ void __cdecl myFunction(int a, int b, int c) { // function body } int main() { myFunction(1, 2, 3); return 0; } ``` 在上面的例子中,参数 3 会先被压入堆栈,然后是参数 2 和 1,最后调用函数 myFunction。函数 myFunction 执行完毕后,调用方负责清理堆栈。 __stdcall 是一种常用的调用约定,参数从右往左依次压入堆栈,由被调用方清理堆栈。这意味着参数的顺序是反向的,但被调用方负责清理堆栈。例如: ```c++ void __stdcall myFunction(int a, int b, int c) { // function body } int main() { myFunction(1, 2, 3); return 0; } ``` 在上面的例子中,参数 3 会先被压入堆栈,然后是参数 2 和 1,最后调用函数 myFunction。函数 myFunction 执行完毕后,被调用方负责清理堆栈。 总的来说,__stdcall 比 __cdecl 调用约定速度更快,因为不需要调用方清理堆栈。但是,__stdcall 只适用于固定数量的参数,而且参数的类型必须是已知的,因为被调用方需要知道清理堆栈的大小。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值