美文网首页
cdecl与stdcall的区别

cdecl与stdcall的区别

作者: 4thirteen2one | 来源:发表于2019-04-08 16:19 被阅读0次
  • 参考

    • https://www.cnblogs.com/52yixin/archive/2011/06/29/2093634.html
    • https://www.cnblogs.com/yzl050819/p/6068824.html
  • _cdecl 是 C Declaration 的缩写,表示 C 语言默认的函数调用方法:
    所有参数从右到左依次入栈,这些参数由调用者清除,称为手动清栈。被调用函数无需要求调用者传递多少参数,调用者传递过多或者过少的参数,甚至完全不同的参数都不会产生编译阶段的错误。

  • _stdcall 是 Standard Call 的缩写,是 C 的标准调用方式:
    所有参数从右到左依次入栈,如果是调用类成员的话,最后一个入栈的是this指针。这些堆栈中的参数由被调用的 函数在返回后清除,使用的指令是 retn X,X表示参数占用的字节数,CPU 在 ret 之后自动弹出X个字节的堆栈空间。称为自动清栈。函数在编译的时候就必须确定参数个数,并且调用者必须严格的 控制参数的生成,不能多,不能少,否则返回后会出错。

stdcall 约定是被调用者清栈,返回时指令带一个退栈参数就可以了,被调用者自己一句ret n就完事了。
cdecl 约定是调用者清栈,就是每一个调用者在函数调用完成后,要每一个调用者自己去拉esp把栈状况改回来。
stdcall的缺点就是无法支持可变数量的参数,因为被调用者必须确定参数数量才能自己清栈。
来源:知乎

相关文章

网友评论

      本文标题:cdecl与stdcall的区别

      本文链接:https://www.haomeiwen.com/subject/rhauiqtx.html