函数形参分为:值类型,引用类型。 值类型分为 值类型和指针
函数默认是有栈大小的 函数栈默认1-2M编译器自动分配,作用参数压栈,函数返回值临时变量创建。函数递归时断点保护,变量保护。
由此可以大致计算函数可以递归调用的次数。
例如下面的程序
struct stuStudent
{
int num[1024];
};
void print(stuStudent b)
{
cout<<a<<endl;
a++;
print(b);
}
int main()
{
stuStudent st;
cout<<sizeof(st)<<endl;
system("pause");
print(st);
system("pause");
return 0;
}
此函数递归调用500次 500*1024*4 = 2M
其次你还需要明白下面的几点:
先把编译和运行时搞清楚!
形参没空间,只是为了确定原型,以便在函数调用时,为实参分配空间做准备 **************
实参在运行时堆栈中分配空间,如果是数组,传递的是指针//
局部变量的话,一般是不分配空间的,它们位于寄存器中
局部数组的话,空间是预先分配的,位于数据段中,调用函数时(此函数中定义),才将数组拷贝至运行时堆栈
当然,你声明成static就不copy了
那么你在看看下面的程序:
vector<int> Inited() { vector<int> ve; for(int i =0;i<1024*1024*10;i++) ve.push_back(i); return ve; }
int main() { vector<int> ve = Inited(); system("pause"); return 0; }
这个程序在调用过程中不会出现任何问题。
关键就在vector这个数据结构中,他内部有个数组的首指针。是动态管理内存的,分配在堆上面的,所以没有问题
可以这样验证cout<<sizeof(ve); 结果输出12