【问题标题】:Does static make a difference for a const local variable?static 对 const 局部变量有影响吗?
【发布时间】:2019-07-23 08:53:14
【问题描述】:

想象以下声明:

void foo(){
    const std::array<int, 80000> arr = {/* a lot of different values*/};
    //do stuff
}

还有第二个:

void foo(){
    static const std::array<int, 80000> arr = {/* a lot of different values*/};
    //do stuff
}

如果有的话,这两者之间可能存在哪些性能差异?这些解决方案是否存在任何危险?

【问题讨论】:

  • static 的情况下,它们可能不在堆栈中,而是在只读部分中。可能也依赖于编译器。
  • 出于好奇:您手头是否有真正的问题,或者这只是一个学术练习? (在这两种情况下都是一个有效的问题)
  • @user463035818 我正在代码审查期间进行讨论;)
  • 取决于评论者,这可能是一个真正的问题:P
  • @Scheff withoutStatic 每次从静态数据 (.LC0) 调用时都会构建数组。 withStatic 使用一个数组,其结构已优化为常量 (withStatic()::arr)。

标签: c++ static constants


【解决方案1】:

暂时忘记数组。这混淆了两个不同的问题。您已经得到了解决寿命和存储问题的答案。我将解决初始化问题。

void f() {
    static const int x = get_x();
    // do something with x
}

void g() {
    const int x = get_x();
    // do something with x
}

这两者的区别在于,第一个只会在第一次调用f()时调用get_x()x 在程序的其余部分保留该值。每次调用g() 时,第二个都会调用get_x()

如果get_x() 在后续调用中返回不同的值,这很重要:

int current_x = 0;
int get_x() { return current_x++; }

【讨论】:

    【解决方案2】:

    这些解决方案是否存在任何危险?

    非静态是危险的,因为数组很大,而为自动存储保留的内存是有限的。根据系统和配置,该阵列可以使用大约 30% 的自动存储可用空间。因此,它大大增加了堆栈溢出的可能性。

    虽然优化器肯定会避免在堆栈上分配内存,但您有充分的理由希望您的非优化调试版本也不会崩溃。

    【讨论】:

      【解决方案3】:

      如果有的话,这两者之间可能存在哪些性能差异?这些解决方案是否存在任何危险?

      区别完全取决于您如何使用foo()

      第一种情况:(低概率):您的实现是这样的,您将只调用一次foo(),也许您已经创建了单独的函数来按照实践划分代码逻辑。好吧,在这种情况下,声明为静态是非常糟糕的,因为静态变量或对象会一直保留在内存中,直到程序结束。所以想象一下你的变量不必要地占用内存。

      第二种情况:(高概率):你的实现是这样的,你会一次又一次地调用foo()。然后非静态对象将被一次又一次地分配和取消分配。这将占用大量的 CPU 时钟周期,这是不希望的。在这种情况下使用静态。

      【讨论】:

        【解决方案4】:

        在这种特殊情况下,关于在初始化变量上使用static 时要考虑的一点:

        来自 C++17 标准:

        6.7.1 静态存储时长[basic.stc.static]
        ...
        2 如果一个具有静态存储持续时间的变量有初始化或有副作用的析构函数,即使它看起来没有被使用也不应该被淘汰,但可以按照 15.8 中的规定消除类对象或其复制/移动。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2011-02-22
          • 1970-01-01
          • 2012-11-05
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多