静态对const局部变量有影响吗?

bar*_*top 19 c++ static const

想象一下以下声明:

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

第二个:

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

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

Pet*_*ker 15

暂时忘掉阵列.这混淆了两个不同的问题.您有解决生命周期和存储问题的答案.我将解决初始化问题.

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

void g() {
    const int x = get_x();
    // do something with x
}
Run Code Online (Sandbox Code Playgroud)

这两者之间的区别在于第一个只调用get_x()第一次f()调用; x通过该计划的其余部分保留该价值.第二个将在get_x()每次调用时g()调用.

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

int current_x = 0;
int get_x() { return current_x++; }
Run Code Online (Sandbox Code Playgroud)


eer*_*ika 12

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

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

虽然优化器肯定可以避免在堆栈上分配内存,但是有充分的理由说明为什么您希望非优化的调试版本也不会崩溃.


Abh*_*arg 5

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

区别完全取决于您的使用方式foo()

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

第二种情况:(高概率):您的实现方式是您将foo()一次又一次地调用。然后非静态对象将被分配并一次又一次地解除分配。这将占用大量的CPU时钟周期,这是不希望的。在这种情况下,请使用static。