我有单例类,当同时调用一个单例方法不止一次时,这个方法有局部变量。单例的每个方法调用是否都有自己的私有堆栈,我是否需要担心在调用之间共享/混合局部变量数据?
4 回答
在类方法中使用局部变量(是否为单例并不重要)与在常规函数中使用局部变量没有区别。局部变量不会混淆。
不,您不必担心这一点。更正您的术语:“单例的每个方法调用是否都有自己的私有堆栈” - 不是它自己的堆栈,而是每个方法调用都有自己的堆栈框架,所以你没事。
单例方法与普通函数(在 C++ 中)相同。以同样的方式考虑局部变量。
请注意,这不适用于静态局部变量,它们在方法调用之间专门共享。
每个方法都将获得自己的私有堆栈。唯一关心共享的可能性是类中的静态变量....但是由于你的类是单例的,它也适用于你的类的实例变量。方法的局部变量在堆栈中总是新鲜的,不需要关心它们。
我不确定你是在谈论递归还是多线程调用,所以我假设你的意思是递归。
每次调用该方法时,任何未声明为静态的局部变量都会在堆栈上分配。它的工作方式是每个调用都有它自己的堆栈“框架”当调用完成时,堆栈框架被释放(并且所有局部变量都被销毁)。
因此,当调用函数 foo() 时,它的局部变量位于堆栈上的一个帧中,我们称它为帧 A。如果 foo 调用自己,则添加另一个帧,我们称它为 B。在第二次调用的生命周期中,两个帧A 和 B 存在,但 A 本质上是休眠的(通常,可以间接修改 A 中的数据,例如通过指针)。当第二个调用退出时,B 框架被释放,A 框架再次变为活动状态。最后,当 top 调用结束时,A 帧消失。
由于堆栈空间有限,您必须小心不要创建超出堆栈可以容纳的帧。如果这样做,则称堆栈“溢出”。