能否让非静态局部变量仅首次调用初始化,且各栈帧拥有独立可修改副本
结论
做不到,你提出的三个要求本身是互斥的,你给出的现有代码也无法实现该效果。
原因说明
- 你当前代码里的
y是普通自动局部变量,每次调用foo时都会在当前栈帧重新分配内存、执行0值初始化,确实每个栈帧有独立的y副本可单独修改,但每次调用都会重新初始化,不符合「仅首次调用初始化一次」的要求。 - 如果按照「仅首次调用初始化一次」的要求,C++原生只能用
static存储类修饰变量(就像你代码里的x),但static变量存储在全局静态区,全程序只有唯一一份副本,所有递归调用共享同一个变量,不可能实现每个栈帧有独立副本的要求。
折中实现方案
如果你能接受「初始值仅首次调用时计算一次,后续每次调用用该固定初始值初始化当前栈帧的y」,可以用如下写法:
void foo() { static const int y_init_val{0}; // 仅首次调用foo时完成初始化,后续调用不会重新赋值 int y{y_init_val}; // 每个栈帧用提前算好的初始值生成独立副本 // 后续修改y互不影响,例如: ++y; foo(); }
该写法已经能覆盖绝大多数类似需求的场景,但严格来说y本身还是会在每次调用时执行拷贝初始化,只是初始化的源值仅生成一次,如果你要求y本身完全不做重复初始化,没有任何实现方案。
内容的提问来源于stack exchange,提问作者bni
相关产品推荐
相关产品推荐

