C++ 静态对常量局部变量有影响吗?

C++ 静态对常量局部变量有影响吗?,c++,static,constants,C++,Static,Constants,想象一下下面的声明: void foo(){ const std::array<int, 80000> arr = {/* a lot of different values*/}; //do stuff } void foo(){ const std::array arr={/*许多不同的值*/}; //做事 } 第二个: void foo(){ static const std::array<int, 80000> arr = {/* a

想象一下下面的声明:

void foo(){
    const std::array<int, 80000> arr = {/* a lot of different values*/};
    //do stuff
}
void foo(){
const std::array arr={/*许多不同的值*/};
//做事
}
第二个:

void foo(){
    static const std::array<int, 80000> arr = {/* a lot of different values*/};
    //do stuff
}
void foo(){
静态常量std::array arr={/*许多不同的值*/};
//做事
}
这两者之间可能存在的性能差异是什么?这些解决方案是否存在任何危险

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

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

虽然一个优化者可能会避免在堆栈上分配内存,但是有很好的理由说明为什么您希望非优化的调试构建也不会崩溃

这两种解决方案之间可能存在的性能差异(如果有的话)是什么?这些解决方案是否存在任何相关的危险

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

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


第二种情况:(高概率):您的实现是这样的:您将一次又一次地调用
foo()。非静态对象将被重新分配和分配,这将占用大量的CPU时钟周期,这是不需要的。在这种情况下使用静态。

在这个特定的上下文中,考虑关于使用初始化的变量:<代码>静态< /代码>的一点:

从C++17标准:

6.7.1静态存储时间

如果静态存储持续时间的变量具有初始化或具有副作用的析构函数,则即使该变量看起来未使用,也不应消除该变量,除非类对象或其副本/移动可以按照15.8中的规定消除


暂时忘记阵列。这混淆了两个不同的问题。您已经找到了解决生存期和存储问题的答案。我将解决初始化问题

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++; }

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