C++中函数调用的方式

C++采用参数压栈的方式进行函数调用:

1.调用者依次把参数压栈,然后调用函数。

2.函数被调用后,在堆栈中取得数据,并进行计算。

3函数计算结束以后,或者调用者,或者函数本身修改堆栈,使堆栈恢复原状。


问题:1:函数调用时需要以什么样的方式进行传递。对于不同函数调用,参数的传递方式采取不同的方式对待,以使得其调用的效率尽可能提高。

     2; 调用结束时系统堆栈由谁来清除。不同的编译器产生栈的方式不尽相同,那么调用者能否正常的完成清楚工作呢?答案是不能




stdcall 实参以参数列表从右向左一次入栈,出栈相反。函数堆栈由被调用方自己释放。


stdcall 的调用方式意味着:

(1)参数从右向左一次压入堆栈

(2)由被调用函数自己来恢复堆栈

(3)函数名自动加前导下划线,后面紧跟着一个@,其后紧跟着参数的尺寸。

上面那个函数翻译成汇编语言将变成:

push b 先压入第二个参数

push a 再压入第一个参数

call  function 调用函数


cdecl :C/C++默认的调用方式,实参是以实参列表从右向左依次向左入栈。

(1)参数从右向左一次压入堆栈。

(2)由调用者恢复堆栈。

(3)函数名自动加前导下划线。


(3)thiscall:类的非静态成员函数默认的调用约定,其不能用在含有可变参数的函数上,否则编译会出错。实参以参数列表从右依次向左入栈,出栈相反。函数堆栈由被调用方自己释放的。但是类的非静态成员函数内部都隐含有一个this指针,该指针不是存放在函数堆栈上,而是直接存放在CPU寄存器上。


(4)fastcall:快速调用。它们的实参并不是存在函数堆栈上,而是直接存在CPU寄存器上,所以不存在压栈、入栈、函数堆栈释放。






阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭
关闭