【问题标题】:Big size static array required需要大尺寸静态数组
【发布时间】:2012-06-16 17:05:52
【问题描述】:

我想要一个程序中的大数组。

我的代码有一个包含 3 个浮点类型变量的结构,我想要一个大尺寸的这个结构的 3 维数组。
我的代码给出了小型数组的输出,但是当我增加数组的大小时,我得到一个堆栈溢出异常/错误。

请帮忙。

【问题讨论】:

  • 简答:在堆上创建。
  • 如果你真的需要所有这些维度,我会把它包装成一维向量。
  • 哇,你需要一个5维数组吗?
  • @KaranArora This 给你一个很好的解释。
  • 你需要一艘更大的船。

标签: c++ visual-c++ multidimensional-array stack


【解决方案1】:

我不知道您是否需要,但如果您愿意,您可以使用链接器选项更改默认堆栈大小,例如在 Visual Studio 中转到“属性 - 配置属性 - 链接器 - 系统 - 堆栈保留大小”。

【讨论】:

  • 否 - 这不是解决方案。要么 malloc 它,要么使它成为一个全球性的。更好的是,使用更好的数据结构:)
  • @MichaelDorgan Windows 区分保留和提交内存,因此提前保留足够的堆栈空间可能不像乍一看那样浪费。
  • 他想要堆栈 - 他得到堆栈:)
【解决方案2】:

除了在堆上分配它之外,您还可以尝试使用/F/STACK 选项或在项目属性中保留更大的堆栈:

【讨论】:

  • 来吧,伙计们,你们不要在这里给婴儿刀。让他选择一个更好的解决方案。
【解决方案3】:

代替

int main() {
   float array[N][N][N][N][N];
   ...

float array[N][N][N][N][N];

int main() {
   ...

或者,写:

int main() {
   static float array[N][N][N][N][N];
   ...

顺便说一句:我在 VC10/Win32 中的默认设置允许堆栈分配高达 N=12,这意味着 ~ 990KB。

问候

rbo

【讨论】:

  • 是的,这是有效的。您还可以通过更改为堆栈保留的内存来增加 N 的值。默认为 1Mb。
【解决方案4】:

这里定制的解决方案是std::vector。它在堆上分配内存,这比堆栈大得多,并且可以更改其大小而无需额外的努力。

typedef std::vector<float> vec;
typedef std::vector<vec> vec2D;
typedef std::vector<vec2D> vec3D;
typedef std::vector<vec3D> vec4D;
typedef std::vector<vec4D> vec5D;

vec5D d (15, vec4D (15, vec3D (15, vec2D (15, vec (15)))));
//use as you would a normal array for the most part

当然,拥有一个 5D 数组(如 cmets 中提到的“需要”)并不是您特别想要的。我建议你创建一个 Matrix 类,它有一个底层的一维向量。

更好的是,重新考虑您的设计。很少有真正需要像这样的高度多维数组的时候。

【讨论】:

  • 关于 std::array 的部分不正确 - 内存不是动态分配的。
  • @jrok,我可以发誓我已经看到/进行过这个讨论,而且它在堆上。我必须找到它。
  • 感谢有关在堆上分配内存的信息。实际上有 1 个体积元素数组,它是 3D ,以及一个表面元素是 2D ,我需要两个之间的距离。
  • @jrok,啊,是的,那不是std::array。让我来解决这个问题。
  • 我认为 5D 数组最适合它,因为我可以很容易地回忆起特定的距离,顺便说一句,现在代码正在运行,我通过更改堆栈大小和全局分配来做到这一点
猜你喜欢
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2021-08-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-25
相关资源
最近更新 更多