关于fastcall和stdcall

套马的野汉子 2017-11-14 10:03:20
请教各位大神,什么时候用fastcall,什么时候用stdcall,我觉得fastcall完全可以代替stdcall啊,fastcall省内存而且速度还快,为什么还要用stdcall呢?求解!
...全文
202 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
0_0菜鸟 2017-11-15
  • 打赏
  • 举报
回复
找到原因了 https://stackoverflow.com/questions/13089752/why-should-i-not-use-fastcall-instead-the-standard-cdecl
Dobzhansky 2017-11-15
  • 打赏
  • 举报
回复
对,既然是调用约定就是两方的问题
Saleayas 2017-11-14
  • 打赏
  • 举报
回复
但是不省寄存器啊。 这些都是有历史渊源的。那时候资源紧张,所以在不同的场合才需要不同的约定。 现在 x64 的程序几乎都不需要了。
真相重于对错 2017-11-14
  • 打赏
  • 举报
回复
同一个编译器下,完全可以替代。如果不同呢?比如vc,fastcall用到了两个寄存器,但bc,却用了3个 而且你如果查了资料,应该知道win32api,基本是stdcall的,为什么呢? 想明白这一点,就应该清楚了。
套马的野汉子 2017-11-14
  • 打赏
  • 举报
回复
引用 8 楼 FancyMouse 的回复:
[quote=引用 7 楼 baidu_20341663 的回复:] 但是为什么放着寄存器传值不用,用栈传值呢?相比于寄存器传值,栈传值速度慢而且占内存
只有寄存器本来不用的时候才快。寄存器在用的时候,你要先保存老数据,再把函数参数拷上去,函数调用完了再要把老数据拷回寄存器,这更慢。32位的时代通用寄存器本来就没几个,不可能因为你这个fastcall而让整个函数不用那两个寄存器的。[/quote]1.fastcall速度快是因为没那么多压栈出栈,少了一些寻址的过程,不是因为mov指令。2.就算是stdcall,也会把数据放到那几个寄存器里,编译器自己会平衡寄存器的使用。不管用不用fastcall那几个寄存器都会使用。所以我还是觉得fastcall可以取代stdcall/
mLee79 2017-11-14
  • 打赏
  • 举报
回复
原始社会遗留下来的罢了, 那时候各种不同的语言, 用着各种不同的调用约定, x86 不幸的要兼容几十年前的代码, 就搞出各种飞机 ...
FancyMouse 2017-11-14
  • 打赏
  • 举报
回复
引用 7 楼 baidu_20341663 的回复:
但是为什么放着寄存器传值不用,用栈传值呢?相比于寄存器传值,栈传值速度慢而且占内存
只有寄存器本来不用的时候才快。寄存器在用的时候,你要先保存老数据,再把函数参数拷上去,函数调用完了再要把老数据拷回寄存器,这更慢。32位的时代通用寄存器本来就没几个,不可能因为你这个fastcall而让整个函数不用那两个寄存器的。
套马的野汉子 2017-11-14
  • 打赏
  • 举报
回复
引用 5 楼 hdt 的回复:
引用 4 楼 baidu_20341663 的回复:
[quote=引用 3 楼 hdt 的回复:] 不同的编译器的兼容性,如何考虑?
几乎所有编译器都支持这3种调用规则吧?
对,但是对寄存器解释是不一样的 [/quote]但是为什么放着寄存器传值不用,用栈传值呢?相比于寄存器传值,栈传值速度慢而且占内存
赵4老师 2017-11-14
  • 打赏
  • 举报
回复
真相重于对错 2017-11-14
  • 打赏
  • 举报
回复
引用 4 楼 baidu_20341663 的回复:
引用 3 楼 hdt 的回复:
不同的编译器的兼容性,如何考虑?
几乎所有编译器都支持这3种调用规则吧?
对,但是对寄存器解释是不一样的
套马的野汉子 2017-11-14
  • 打赏
  • 举报
回复
引用 3 楼 hdt 的回复:
不同的编译器的兼容性,如何考虑?
几乎所有编译器都支持这3种调用规则吧?
真相重于对错 2017-11-14
  • 打赏
  • 举报
回复
不同的编译器的兼容性,如何考虑?
套马的野汉子 2017-11-14
  • 打赏
  • 举报
回复
引用 1 楼 Saleayas 的回复:
但是不省寄存器啊。 这些都是有历史渊源的。那时候资源紧张,所以在不同的场合才需要不同的约定。 现在 x64 的程序几乎都不需要了。
嵌入式程序不就是资源紧张吗?我只想知道为什么有fastcall了为什么还要有stdcall,为什么fastcall能代替stdcall?

69,381

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧