系统取函数的实参是从后面开始取还是从前面开始取

wuyan16001 2008-10-26 10:32:09
调用函数的时候,系统取函数的实参是从后面开始取还是从前面开始取?

比如要调用的函数为 swap(a,b),其中a,b是输入的实参。系统是先取b,还是先取a
...全文
75 8 打赏 收藏 转发到动态 举报
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
xzhangyu 2008-10-26
  • 打赏
  • 举报
回复
这个和编译器有关吧。压栈的方式不一样而已。一般是从左到右吧,比如如果带变参的情况。
wuyan16001 2008-10-26
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 akirya 的回复:]
都有可能.
[/Quote]
哦,那请教下,啥时候会从前面调用先,啥时候从后面调用呀
  • 打赏
  • 举报
回复
都有可能.
xhs_lh04 2008-10-26
  • 打赏
  • 举报
回复
前面
arong1234 2008-10-26
  • 打赏
  • 举报
回复
5楼的帖子你看没看啊?不是已经告诉你了么?
[Quote=引用 7 楼 wuyan16001 的回复:]
哦,那有没有从左到右调用的
[/Quote]
wuyan16001 2008-10-26
  • 打赏
  • 举报
回复
哦,那有没有从左到右调用的
帅得不敢出门 2008-10-26
  • 打赏
  • 举报
回复
一般从右向左的.
5楼说的很详细.
kiffa 2008-10-26
  • 打赏
  • 举报
回复
一般是自右向左压栈的,另外需要注意的是参数求值顺序和压栈顺序没有必然的联系。

以下是转帖的内容:

关于函数的调用约定:
__cdecl __fastcall与 __stdcall,三者都是调用约定(Calling convention),它决定以下内容:1)函数参数的压栈顺序,2)由调用者还是被调用者把参数弹出栈,3)以及产生函数修饰名的方法。

1、__stdcall调用约定:函数的参数自右向左通过栈传递,被调用的函数在返回前清理传送参数的内存栈,

2、_cdecl是C和C++程序的缺省调用方式。每一个调用它的函数都包含清空堆栈的代码,所以产生的可执行文件大小会比调用_stdcall函数的大。函数采用从右到左的压栈方式。注意:对于可变参数的成员函数,始终使用__cdecl的转换方式。

3、__fastcall调用约定:它是通过寄存器来传送参数的(实际上,它用ECX和EDX传送前两个双字(DWORD)或更小的参数,剩下的参数仍旧自右向左压栈传送,被调用的函数在返回前清理传送参数的内存栈)。

4、thiscall仅仅应用于"C++"成员函数。this指针存放于CX寄存器,参数从右到左压。thiscall不是关键词,因此不能被程序员指定。

5、 naked call采用1-4的调用约定时,如果必要的话,进入函数时编译器会产生代码来保存ESI,EDI,EBX,EBP寄存器,退出函数时则产生代码恢复这些寄存器的内容。naked call不产生这样的代码。naked call不是类型修饰符,故必须和_declspec共同使用。

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

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