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寄存器上,所以不存在压栈、入栈、函数堆栈释放。