一段代码:
#include <array>
#include <iostream>
int function()
{
const int N=10000000;
std::array<double, N> array{0.0};
std::cout<<"N="<<N<<std::endl;
return 0;
}
int main(int, char **)
{
function();
exit(0);
}
启动程序时,我看到:
Segmentation fault (core dumped)
该程序仅在N<10000000
运行。我知道原因是堆栈溢出。但是如果我要声明数组为静态的话:
static std::array<double, N>{0.0};
一切正常,直到N=1000000000
。我很惊讶。
据我了解,函数内部的静态std::array
/ std::vector
是在全局内存中分配的(就像它是静态全局数组一样),而不是在堆栈上。这就是为什么我可以在函数内部声明一个静态数组的原因,该数组比该函数局部的普通数组大得多。是真的吗?
答案 0 :(得分:0)
是的,是的。 :)
出于完整性考虑,值得一提的是,您还可以使用new
运算符在堆上分配数组。
您还可以选择将数据存储在std::vector
中。性能/灵活性之间的权衡与std::array
稍有不同,但是即使对于存在于堆栈中的向量,也不会出现堆栈大小的问题(因为底层存储是动态分配的)。