静态对const局部变量有所作为
Does static make a difference for a const local variable?
想象以下声明:
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
}
如果有的话,这两者之间可能有什么可能的性能差异?这些解决方案中有任何危险吗?
暂时忘记阵列。这弄清楚了两个单独的问题。您有答案,可以解决寿命和存储问题。我将解决初始化问题。
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++; }
,这些解决方案中有任何危险吗?
非静态是危险的,因为阵列很大,并且保留用于自动存储的内存是有限的。根据系统和配置,该数组可以使用可自动存储的约30%的空间。因此,它大大增加了堆栈溢出的可能性。
虽然优化器肯定可以避免在堆栈上分配内存,但是有充分的理由您希望您的不优化调试构建也不会崩溃。
这两个(如果有的话)之间可能存在哪些性能差异?
是否有任何危险?
差异完全取决于您如何使用foo()
。
第1个情况:(低概率):您的实现使您只能调用foo()
一次,也许您已经创建了单独的函数来按照实践来划分代码逻辑。在这种情况下,宣布为静态的情况非常糟糕,因为静态变量或对象保留在内存中,直到程序结束为止。因此,请想象您的变量不必要地占据内存。
第二个情况:(高概率):您的实现使您可以一次又一次地调用foo()
。然后,非静态对象将一次又一次地分配并DE分配。这将进行大量的CPU时钟周期。在这种情况下,不需要静态。
在此特定上下文中,要考虑使用static
在具有初始化的变量上使用:
来自C 17标准:
6.7.1静态存储持续时间[basic.stc.static]
...
2如果具有静态存储持续时间的变量具有初始化或具有副作用的破坏者,则即使似乎未使用,也不会消除它,除了类对象或类对象外它的副本/移动可以按15.8中的规定消除。
- 使用的未初始化局部变量'Quick'
- 修复未初始化的局部变量错误
- 局部变量保留函数中的值
- 如何使用 C++ 中的继承函数访问派生类中的局部变量
- 将引用分配给局部变量,如果局部变量超出范围,它会超出范围吗?
- Gnuplot_i.hpp C++接口绘制局部变量而不是文件
- 如何在函数外部访问函数中局部变量的值?
- 赋予全局变量而不是局部变量优先级的函数 - (异常行为)
- C++中静态方法的局部变量范围
- 未初始化的局部变量错误甚至认为我初始化了它(C++)
- 离开范围后如何保护局部变量的值?
- 局部变量名称冲突
- C++ lambda:如何'freeze'局部变量的值?
- 我应该使我的局部变量常量还是可移动的
- 获取具有静态局部变量的绑定/推断捕获 lambda 的函数指针
- 全局和局部变量初始化与 constexpr 的差异背后的基本原理
- 返回对局部变量 - C++ 的引用
- 是否可以影响 C++ 中回调函数的局部变量?
- 警告 C4101 未引用的局部变量
- 静态对const局部变量有所作为