【问题标题】:To create a persistant variable is it better to have a local static variable or a global?要创建一个持久变量,是使用局部静态变量还是全局变量更好?
【发布时间】:2013-10-17 08:30:23
【问题描述】:

假设您有一个类 (c++) 或模块(单个 c 文件)。然后在你的一个函数中,你想存储一个变量的副本并保存它的值直到下次调用函数时,最好有一个全局的(在 c++ 中可能是私有的,而不是在 c 中保留它在模块范围内)或制作一个局部静态变量?

例如:

void some_func_that_does_not_do_anything_useful(int arbVal)
{
    static int lastArbVal = 0;

    if (arbVal > lastArbVal)
    {
        lastArbVal = arbVal;
    }
}

我制作静态的原因是尽可能限制其范围,但我读到的某些内容建议您应该为此使用全局变量,所以现在我很困惑。

什么是最好的(如果有的话)?优点/缺点?

【问题讨论】:

  • 如果您只在该功能中使用它,而不是在其他任何地方,那么将其设为static 可能是最好的解决方案。尽管您可能想考虑多线程等情况,因为静态变量将在所有线程之间共享。
  • 为了封装,最好使用本地静态。这也是许多 C 函数采用的方法。 strtok 浮现在脑海中。
  • 引用strtok 手册页:“永远不要使用这些函数”。让我们不要用它作为如何做事的例子:-)
  • 你能分享你在这种情况下应该使用全局变量的资源吗?
  • 不,这个例子几乎展示了我在我的代码中是如何使用它的。它都在这个功能中,没有在其他任何地方使用:)

标签: c++ c static


【解决方案1】:

这里的规则很简单:如果变量需要被多个函数访问,则将其设为全局变量。如果没有,函数内部的static 变量通常会更好。优点之一是它避免了污染全局命名空间。

请注意,如果全局变量不需要在文件外访问,最好将其声明为文件范围变量(即声明为static

回到您的示例,我认为最好像您已经使用的那样使用 static 变量。

【讨论】:

  • 文件范围 static 的替代方案是匿名命名空间。
  • 文件范围static 可能不适合的另一个原因是静态初始化顺序。如果使用它的函数在初始化来自不同翻译单元的其他静态变量时被调用,那么你就有麻烦了。
猜你喜欢
  • 2017-12-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-06-12
  • 2012-06-13
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多