想象一下以下声明:
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%的可用空间用于自动存储.因此,它大大增加了堆栈溢出的可能性.
虽然优化器肯定可以避免在堆栈上分配内存,但是有充分的理由说明为什么您希望非优化的调试版本也不会崩溃.
两者之间可能存在哪些性能差异?这些解决方案是否存在任何危险?
区别完全取决于您的使用方式foo()。
第一种情况:(低概率):您的实现是foo()只调用一次,也许您已经创建了单独的函数来按惯例划分代码逻辑。在这种情况下,声明为static非常不好,因为静态变量或对象会保留在内存中,直到程序结束。因此,请想象您的变量不必要地占用了内存。
第二种情况:(高概率):您的实现方式是您将foo()一次又一次地调用。然后非静态对象将被分配并一次又一次地解除分配。这将占用大量的CPU时钟周期,这是不希望的。在这种情况下,请使用static。