深度解析函数调用与变量存储

8月 21st, 2012
Visited 8333 times, 11 so far today
0

Comments

       对于堆栈结构相应大家一定还是很熟悉的吧,其实C++中函数的调用就是应用这一经典数据结构的完美体现。堆栈对于函数就像宗教对于人一样起异常重要的作用。堆栈:即一种先进后出的结构,主要有二种操作方式 1.压入栈   2.弹出栈。   举个比较形象的例子,比如一组菜盘(就是我们平时吃饭用的碟子),我们平时取的时候总是先从最上面取(即:弹出),而放的话也是放在最上面(即:压入)。总体来说就是这样的一种形式。那么对于C++中函数的调用,是怎么具体来执行的呢?

代码示例:

#include <iostream>
using namespace std;

int increame(int x){
return x * x;
}

int main(){
int a = 2;
cout<<“After Increame a =”<<increame(a)<<endl;
}

   操作系统调用main()入口函数,把main()函数所有相关的数据项(即函数包含的变量和函数操作完成时返回地址等信息做为一个整体)压入到函数调用堆栈中(操作系统维护着这样的一块内存,此内存大小是一定的)。此时堆栈中的main函数就是一条程序的活动记录,此记录中中包含所有main中声明的变量和整个main函数执行完成后返回给相应系统的地址。然后main函数又调用increame()函数,此时increame()函数也做为一条活动记录被整体的压入了函数调用堆栈中。在压入的时候,increame()函数中的局部变量创建,如果存在同名变量,那么会把把main函数中同名变量隐藏(此时调用increame()函数中的变量时,就是increame函数作用域内的变量,而不是main函数中的同名变量)。increame()函数完成相应的操作后,increame函数的活动记录就被弹出,把相应的处理结果返回到调用函数处(也就是increame函数活动记录中所记录的返回地址(即:调用函数的调用位置处。也就是这条语句中cout<<“After Increame a =”<<increame(a)<<endl;increame(a)处)。并且此时increame()函数中的所有局部变量自动销毁。把相应结果返回到调用函数main处。main()函数处理完成,则main函数的活动记录弹出函数调用堆栈。销毁所有main函数中的变量,并根据main函数压入堆栈时的活动记录的地址返回到相应的系统调用处(此处也就是系统调用main()函数的地方)。

                   总结:由此得出的结论就是,数据结构在计算机中处理异常重要的位置,它的思想,处理问题的方法影响整个程序的现实和程序语言的设计。因此,学好数据结构至关重要。