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@ScheffwithoutStatic
每次从静态数据调用数组时都会构建该数组(.LC0
)withStatic
使用一个数组,该数组的结构已优化为常量(withStatic()::arr
)。