Jag*_*uar 7 c++ static function
我还是一个C++新手.刚刚开始读到类的静态成员函数不是特定于对象的 - 所有对象的成员函数都有一个副本.
现在我脑子里出现了两个问题:
普通函数和静态函数"仅在内存分配方面"有什么区别?
如果成员函数包含一些局部变量怎么办?在这种情况下,函数"应该"具有该变量的单独副本 - 特定于调用该函数的对象...如何在C++中解决此问题?
谢谢 !
普通函数和静态函数"仅在内存分配方面"有什么区别?
没有.除了范围之外,静态函数就像一个全局函数.
即使对于非静态成员函数,也不需要额外的内存.成员函数int C::f(int arg1, int arg2)只是类似的语法糖int C__f(C* this, int arg1, int arg2).
如果成员函数包含一些局部变量怎么办?在这种情况下,函数"应该"具有该变量的单独副本 - 特定于调用该函数的对象...
每次调用函数都有一个局部变量的副本(除非它们是static).这就是C++中可能的递归的原因.
如何在C++中解决这个问题?
函数调用基于"堆栈帧".堆栈框架包括:
this如果适用).static函数中的任何其他非局部变量.无论何时调用函数,都会创建堆栈帧.当函数是,堆栈帧被破坏.如果以递归方式调用函数,则每个递归级别都会获得自己的堆栈帧.例如,如果你有
int factorial(int n) {
if (n <= 1)
return 1;
else
return factorial(n - 1) * n;
}
Run Code Online (Sandbox Code Playgroud)
然后,当您调用时factorial(3),堆栈框架的创建方式如下:
------------------------ stack pointer (SP)
n = 3
RA = <in main()>
Run Code Online (Sandbox Code Playgroud)
进行递归调用时factorial(2),会在堆栈顶部添加一个额外的帧
------------------------ SP
n = 2
RA = <in factorial()>
------------------------
n = 3
RA = <in main()>
Run Code Online (Sandbox Code Playgroud)
另一个递归调用是factorial(1).
------------------------ SP
n = 1
RA = <in factorial()>
------------------------
n = 2
RA = <in factorial()>
------------------------
n = 3
RA = <in main()>
Run Code Online (Sandbox Code Playgroud)
这是递归的基本情况,返回值1存储在寄存器中.函数调用完成后,顶层堆栈帧被销毁,并在保存的返回地址继续执行.
------------------------ SP
n = 2
RA = <in factorial()>
------------------------
n = 3
RA = <in main()>
Run Code Online (Sandbox Code Playgroud)
现在,调用factorial(2)可以计算其返回值(2),并且可以销毁另一个堆栈帧:
------------------------ SP
n = 3
RA = <in main()>
Run Code Online (Sandbox Code Playgroud)
最后,我们可以计算原始函数调用的结果(6),并破坏这个堆栈帧.