函数内部的巨大静态数组与本地数组

时间:2019-07-17 08:07:39

标签: c++ arrays static

一段代码:

#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是在全局内存中分配的(就像它是静态全局数组一样),而不是在堆栈上。这就是为什么我可以在函数内部声明一个静态数组的原因,该数组比该函数局部的普通数组大得多。是真的吗?

1 个答案:

答案 0 :(得分:0)

是的,是的。 :)

出于完整性考虑,值得一提的是,您还可以使用new运算符在上分配数组。

您还可以选择将数据存储在std::vector中。性能/灵活性之间的权衡与std::array稍有不同,但是即使对于存在于堆栈中的向量,也不会出现堆栈大小的问题(因为底层存储是动态分配的)。