C++ - 初始化中的静态分配

Dan*_*ner 5 c++ static

说我有一个C++函数:

void foo(int x) {
    static int bar = x;
}
Run Code Online (Sandbox Code Playgroud)

如果我打电话foo(3)然后打电话foo(4),我的理解是吧的价值仍然是3.这是为什么?我理解为什么初始化的内存分配部分是多余的.但为什么这项任务也被忽略了?

AnT*_*AnT 6

这不是"任务".这是一个初始化.并且,根据C++语言的规则,静态对象的初始化只执行一次 - 当控件第一次传递声明.

在您的例子,控制越过申报barx3.所以,用bar初始化3.它永远不会被"重新初始化",即呼叫foo(4)根本不会影响bar.如果要更改之后的值bar,则必须bar直接修改.


Jon*_*ely 0

考虑一些不同的静态变量:

void foo(int x) {
    static int bar = x;
    static std::string s1 = "baz";
    static std::string s2("baz");
    static int i{2};              // C++11-style uniform initialization
}
Run Code Online (Sandbox Code Playgroud)

您是否还认为每次调用函数时都s1应该“分配”该值?"baz"关于什么s2?关于什么i

这些语句都不执行任何赋值,它们都是初始化,并且只完成一次。仅仅因为语句包含该=角色并不意味着它是一个赋值。

该语言被定义为以这种方式工作的原因是,通常使用局部静态变量来运行一次函数:

bool doInit()
{
  // run some one-time-only initialization code
  // ...
  return true;
}

void func() {
  static bool init = doInit();
  // ...
}
Run Code Online (Sandbox Code Playgroud)

如果init每次调用该函数时都再次分配一个值,那么doInit()将被多次调用,并且将无法达到运行一次性设置的目的。

如果您想在每次调用时更改该值,那很简单......只需更改它即可。但是,如果您希望它不断变化,那么如果语言按照您询问的方式工作,就没有办法做到这一点。

也不可能有static const局部变量:

void func() {
  static const bool init = doInit();
  // ...
}
Run Code Online (Sandbox Code Playgroud)

init哎呀,这会尝试在每次调用时更改它的值。