c++函数的参数传递的原理及其过程
我们只是知道函数调用的过程是先传递参数,然后是函数体,然后是返回值的顺序,但是这个过程怎么实现的,以及参数的入栈顺序等等,这里我大致的也是实验的态度做个验证,验证这句话也是为了加深自己对函数的调用,以及参数的传递的一个深刻的解释
1:验证的题目
1、函数的调用过程的顺序(可能不这么个说法),验证函数是参数先传递个给函数主体,然后是函数体,最后是返回值
2、参数的传递是从右到左压入栈的
3、_fastcall调用协定函数参数的入栈顺序是冲左到右
2:开始验证
为了验证上面的正确性,我写了一小段代码
#include<iostream> using namespace std; int fun(int a,int b); int main() { int m,n; m=2,n=5; int fum; fum=fun(m,n); //断点1 cout<<fum; //断点3 return 0; } int fun(int a,int b) { int sum; sum=a+b; return sum; //断点2 }
验证的思路:
记录在断点1,断点2,断点3,四个位置的fun函数,m,n变量,参数a,参数b,sum,fum的地址以及他们的值,然后做个比较,发现其规律
阶段 | 名称 | fun | m | n | a | b | sum | fum |
断点1 | 内存地址 | 0x008E4410 | 0x003DFAA4 | 0x003DFA98 | null | null | null | 0x003DFA8C |
值 | 55 8b ec 81 ec cc | 02 00 00 00 | 05 00 00 00 | null | null | null | cc cc cc cc | |
断点2 | 内存地址 | 0x008E4410 | NULL | NULL | 0x003DF9B4 | 0x003DF9B8 | 0x003DF9A4 | NULL |
值 | 55 8b ec 81 ec cc | NULL | NULL | 02 00 00 00 | 05 00 00 00 | 07 00 00 00 | NULL | |
断点3 | 内存地址 | 0x008E4410 | 0x003DFAA4 | 0x003DFA98 | null | null | null | 0x003DFA8C |
值 | 55 8b ec 81 ec cc | 02 00 00 00 | 05 00 00 00 | null | null | null | 07 00 00 00 |
通过上面的数据,我们发现:
1:在断点1的位置,函数的参数a和参数b是没有分配空间的,尽管函数已经声明,编译器为函数分配了空间0x008E4410
2:断点2的位置,1、我们发现程序并不是先跳转到断点3,而是先进入函数,并且将函数的参数传递到函数内部
2、a接收过来的是m的值,b接收过来是n的值,并且b的地址位0x003DF9B8高于a的地址位0x003DF9B4四个字节
3、按照栈的入栈顺序是高位到低位入栈的顺序,发现b,先入栈,a后入栈
3:断点3的位置,我们发现返回值已经传递给fum
上述三点可以看出,函数的调用过程是参数,函数体,函数返回值的顺序依次进行,函数的参数的入栈方式是从右向左入栈的,而在函数前使用_fastcall约定,发现参数的顺序则是从左到右入栈了。测试方法和上面一模一样
郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。