函数调用机制与调用约定(转载)
来源:互联网 发布:刷信誉源码平台 编辑:程序博客网 时间:2024/04/27 19:19
1.示例
栈的作用和功能这里就不再叙述了。
先看一个最简单的函数调用例子:
#include "stdafx.h"int call(int _a,int _b);void _tmain(){int a=1;int b=2;int c=call(a,b);}int call(int _a,int _b){return _a+_b;}main函数中调用call函数,并传入2个参数a,b。调用结束后返回赋值给c。这里可以分为两部分分析:
2.函数调用
当调用一个函数时,系统发生进行如下动作,内存模型如下图:
(1)开辟该调用函数的栈空间。
(2)将当前的运行状态压栈
(3)将返回地址压栈
(4)在栈内为传参分配空间
(5)在栈内为函数内局部变量分配空间,执行被调用函数
3.函数返回
当被调用函数结束后,进行返回时,系统进行的动作刚好与函数调用时相反,内存模型如下图:
(1)释放栈内局部变量空间
(2)释放栈内传参空间
(3)退栈,得到返回地址,程序跳转调用处等待
(4)退栈,得到调用前运行状态,恢复调用前运行状态
(5)释放该调用函数栈空间
4.函数调用约定
函数调用时参数的传递过程中还有两个需要注意的问题:
1.多个参数的入栈顺序?
2.谁来清理调用堆栈?
在高级语言中,是通过函数调用约定来说明这两个问题的。C++采用的函数调用约定就是__stdcall。__stdcall包含两个意思,第一是按照C风格传递参数即参数从右自左压入堆栈,函数内部正好从左自右读出参数,第二是函数执行清除堆栈,即调用函数是堆栈中压入参数时占用了位置,这些位置将由调用函数负责清空。
关键字 堆栈清除者 参数传递
__cdecl 调用者 从右向左的顺序压入栈内
__stdcall 被调用者 从右向左的顺序压入栈内
__fastcall 被调用者 保存在寄存器中,然后其他的压入栈内
thiscall(非关键字) 被调用者 压入栈,this指针保存在ECX寄存器内
__cdecl 调用者 从右向左的顺序压入栈内
__stdcall 被调用者 从右向左的顺序压入栈内
__fastcall 被调用者 保存在寄存器中,然后其他的压入栈内
thiscall(非关键字) 被调用者 压入栈,this指针保存在ECX寄存器内
- 函数调用机制与调用约定(转载)
- 函数调用与约定
- 【C++基础之五】函数调用机制与调用约定
- 【C++基础之五】函数调用机制与调用约定
- [转载]论函数调用约定
- 函数调用约定与名字修饰约定
- 函数调用约定与名字修饰约定
- 函数调用约定与名字修饰约定
- 函数调用约定与区别
- 函数调用约定与栈
- 论函数调用约定(转载)
- 转载:剖析VC++函数调用约定
- C语言函数的调用约定-转载
- C与C++的函数调用约定
- 函数调用约定__stdcall与__cdecl
- 函数调用约定与相关指令
- 裸函数_与调用约定
- 函数调用约定
- 编程珠玑之第一章习题7:处理程序存在的缺陷的问答与测试
- poj 2417 Discrete Logging 求解模方程a^x=b(mod n),n为素数+模板题(baby_step giant_step)
- android整合--notification推送通知
- SSH学习笔记二
- Java--chapter03--输出希腊字母
- 函数调用机制与调用约定(转载)
- opengl片段测试之后的逻辑操作
- Android源码目录结构详解
- 结构体和类的区别
- java三种写文件对象详解
- C语言中volatile关键字的作用
- python常用文件操作
- (改进)北京大学2013计算机所本科生保研夏令营考试——E:Oil Deposits
- delphi7 JSON测试