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约定,发现参数的顺序则是从左到右入栈了。测试方法和上面一模一样


     

                                      


          

郑重声明:本站内容如果来自互联网及其他传播媒体,其版权均属原媒体及文章作者所有。转载目的在于传递更多信息及用于网络分享,并不代表本站赞同其观点和对其真实性负责,也不构成任何其他建议。