【发布时间】:2021-07-25 18:24:31
【问题描述】:
我想在循环中使用一个变量,但我不希望在每次迭代时都重新声明它。显然我可以在循环外声明它,但我想知道如果我在循环内将它声明为 static 会发生什么。
为了测试这一点,我在 while 循环中声明了一个 static 和一个 非静态 变量,然后在每次迭代时打印它们的内存地址。我希望 non-static 变量的地址不断变化,而 static 的地址保持不变。
while (true)
{
int var1;
static int var2;
cout << &var1 << "\n"
<< &var2 << endl;
}
结果:令我惊讶的是,两个变量的地址保持不变。
- 这是某种编译器优化,还是我错误地认为重新声明 non-static 变量应该在每次迭代中产生不同的地址?我正在使用没有优化标志的 gcc 9.3.0。
- static 变量是否是在循环外声明 非静态 变量的好选择(假设我在外部范围内不需要它并且我' m 不担心变量会保留其最后一个值,以防以后再次进入循环)?
【问题讨论】:
-
关于“好选择”:取决于您需要变量的用途。你打算如何使用它?你有什么具体的想法吗?
-
尝试将显示的代码放在不同的函数中,然后直接从
main调用它和从另一个函数(由main调用)。那么你应该会看到不同。 -
@Someprogrammerdude 不同之处在于范围,当变量第二次进入循环时,它将以其最后一个值开始。我明白了,但还有其他问题吗?
-
不是范围,而是生命周期。
var1和var2具有完全相同的范围。var2的staticstorage duration 意味着它的生命周期将是整个程序的完整运行时间。 Localstaticvariables 也保证为零初始化,除非以其他方式显式初始化,并且初始化(并且仅初始化)保证是线程安全的并且只发生一次。 -
static选项将为代码添加一些同步,因为函数static对象保证在多线程代码中只被初始化一次。
标签: c++