C++中函数调用的方式
2016-09-01 09:09
204 查看
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寄存器上,所以不存在压栈、入栈、函数堆栈释放。
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寄存器上,所以不存在压栈、入栈、函数堆栈释放。
相关文章推荐
- C++中的成员函数调用原理及this指针的传递方式
- C++中函数调用时的三种参数传递方式
- C#调用C(C++)dll示例教程,包含dll找不到函数入口的解决办法,包含C#dll调用方式不对出错的解决办法
- C/C++:函数的编译方式与调用约定以及extern “C”的使用
- c++之函数的调用方式
- C++中函数调用的方式
- C/C++:函数的编译方式与调用约定以及extern “C”的使用
- C++基础之函数调用方式
- C/C++:函数的编译方式与调用约定以及extern “C”的使用
- C++中函数调用时的三种参数传递方式
- C++ 函数调用方式(_stdcall, _pascal, _cdecl...)总结
- C/C++:函数的编译方式与调用约定以及extern “C”的使用
- 解决c++ 调用lua 方式! 避免重复写逻辑对应的lua 函数
- C++中函数调用时的三种参数传递方式
- PASCAL FAR ----c++ 函数的调用方式
- 使用类成员函数指针调用C++成员函数的一种方式
- 分析C++方式构造函数调用虚函数的问题
- C/C++ 函数调用方式
- C++中函数调用时的三种参数传递方式
- c中调用c++函数方式