请问如果__fastcall能编译出性能更好的程序,为什么不总是用__fastcall? __fastcall和cdecl编译出的程序有什么不同啊?

azk2000 2006-04-19 11:56:28
如题,谢谢
...全文
296 21 打赏 收藏 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
会思考的草 2006-04-21
  • 打赏
  • 举报
回复
这两种情况下,用__fastcall带来的“优化”,几近可以忽略不计。
会思考的草 2006-04-21
  • 打赏
  • 举报
回复
对于VC的编译器而言,参数列表从左向右的入口参数优先使用寄存器传递,寄存器用尽会自动使用栈:
13: foo(1,2,3,4,5,6,7,8,9,0,1,2,3); //__fastcall
00401078 push 3
0040107A push 2
0040107C push 1
0040107E push 0
00401080 push 9
00401082 push 8
00401084 push 7
00401086 push 6
00401088 push 5
0040108A push 4
0040108C push 3
0040108E mov edx,2
00401093 mov ecx,1
00401098 call @ILT+0(foo) (00401005)

13: foo(1,2,3,4,5,6,7,8,9,0,1,2,3); //__cdecl
00401068 push 3
0040106A push 2
0040106C push 1
0040106E push 0
00401070 push 9
00401072 push 8
00401074 push 7
00401076 push 6
00401078 push 5
0040107A push 4
0040107C push 3
0040107E push 2
00401080 push 1
00401082 call @ILT+0(foo) (00401005)
huxzjqhh 2006-04-21
  • 打赏
  • 举报
回复
主要是参数的传入方式不同,对栈的相应操作不同,编译后的函数名也不同
__cdecl是c语言的默认调用约定
__stdcall是pascal的调用约定
huxzjqhh 2006-04-21
  • 打赏
  • 举报
回复
不同语言、编译器的调用约定,各有各的考虑出发点
leechiyang 2006-04-21
  • 打赏
  • 举报
回复
只是函数调用的时候有些不同,性能差异可以忽略,还是要从提高代码质量上着手提高性能把。
azk2000 2006-04-21
  • 打赏
  • 举报
回复
To: codewarrior(会思考的草)
请问,在fastcall下 如果寄存器个数不够,程序会出现什么反应?
rageliu 2006-04-20
  • 打赏
  • 举报
回复
呵呵,看来要复习复习基础了:)明天还要上班,走人了先....
azk2000 2006-04-20
  • 打赏
  • 举报
回复
rageliu,没错,所以cdcel生成的代码要大些啊:)
rageliu 2006-04-20
  • 打赏
  • 举报
回复
不过没记错的话:

cdcel方式参数是由调用者压栈,也由调用者平栈(由于是它压的,所以知道压了几个参数,所以由它平栈时知道需要平的前面入栈参数的个数).而_stdcall方式是由调用者压栈,而由函数自己平栈(函数自己并没有做压栈操作,它怎么知道平栈时参数的个数呢?所以这种方式一般在回调等时候使用,因为这时函数的参数个数是固定的,所以由函数自己平栈也有参数个数的信息)

以上内容不确定,记不清楚了:)嘿嘿
azk2000 2006-04-20
  • 打赏
  • 举报
回复
谁能告诉我是何道理吗?
azk2000 2006-04-20
  • 打赏
  • 举报
回复
嗯,是的,是否__fastcall可以在mfc下通用?既然fastcall编译出来的性能更好(除了不能用可变函数参数),为什么mfc默认是cdcel,我想mfc也是有它的道理的,只是不知道是什么道理:(
rageliu 2006-04-20
  • 打赏
  • 举报
回复
2种方式在参数的入栈顺序和返回时由谁平栈有区别
azk2000 2006-04-20
  • 打赏
  • 举报
回复
__fastcall可以通用吗?有什么限制吗?我看msdn上说其函数前两个参数的大小要小于4位,也就是DWORD,那对于现在32位的程序都适用啊,大对象都用指针或引用,而小对象最大就是DWORD了
sycnick 2006-04-20
  • 打赏
  • 举报
回复
晕,基础知识不够扎实,啃书!
会思考的草 2006-04-20
  • 打赏
  • 举报
回复
存在的就有其合理性,不要搞一言堂。
会思考的草 2006-04-20
  • 打赏
  • 举报
回复
3.有些函数必须使用__cdecl,譬如sprintf这种参数个数不定的函数。
会思考的草 2006-04-20
  • 打赏
  • 举报
回复
1.fastcall不一定快多少
2.寄存器个数不够
azk2000 2006-04-20
  • 打赏
  • 举报
回复
up up
azk2000 2006-04-20
  • 打赏
  • 举报
回复
:) 88
rageliu 2006-04-19
  • 打赏
  • 举报
回复
调用方式不同,编译后函数的名字就不一样,这在连接的时候起作用
加载更多回复(1)

16,550

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Creator Browser
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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