大数组的堆栈溢出但没有同样大的向量?

Posted

技术标签:

【中文标题】大数组的堆栈溢出但没有同样大的向量?【英文标题】:Stack overflow with large array but not with equally large vector? 【发布时间】:2012-11-20 01:19:29 【问题描述】:

我今天在处理大型数据结构时遇到了一个有趣的问题。我最初使用向量来存储超过 1000000 个整数,但后来决定我实际上并不需要向量的动态功能(无论如何,我在声明它时就保留了 1000000 个点),相反,这将是有益的,能够在数据结构中的任何位置添加值。所以我把它切换到一个数组和 BAM 堆栈溢出。我猜这是因为在编译时声明数组的大小会将其放入堆栈并使用动态向量而不是将其放置在堆上(我猜它更大?)。

那么这里的正确答案是什么?回到动态内存系统只是为了把它放在堆上?增加堆栈的大小?还是我在这里的整个事情都偏离了基础......?

谢谢!

【问题讨论】:

好吧,您可以将数组设置为全局(或static)并且它不会使用堆栈空间。出现堆栈溢出的原因是所有局部变量(包括参数)都在堆栈上,其中包括数组的所有内存。 约阿希姆大干一场!静态再次拯救了一天! 关于堆栈溢出的实际实例的问题... 【参考方案1】:

我最初使用向量来存储超过 1000000 个整数

好主意。

但后来我决定我实际上并不需要矢量的动态功能(无论如何,我在声明它时就保留了 1000000 个点)

不是个好主意。你确实需要它。

相反,能够在数据结构中的任何位置添加值将是有益的。

我不关注。

我猜这是因为在编译时声明数组的大小会将其放入堆栈并使用动态向量而不是将其放入堆中(我猜它更大?)。

很多。默认情况下,调用堆栈的大小通常约为 1MB-2MB。您的“堆”(免费存储)仅受可用 RAM 的限制。

那么这里的正确答案是什么?回到动态内存系统,以便将其放入堆中?

是的。

[编辑:Joachim 是对的——static 是另一个可能的答案。]

增加栈的大小?

您可以,但即使您可以从中扩展 4MB,您也没有为其他本地数据变量留下任何回旋余地。最好使用动态内存——这是正确的做法。

或者我在这里的整个事情都偏离了基础......?

没有。

【讨论】:

在 Windows 上,我认为默认堆栈大小是 1 MB。 @BenjaminLindley:我的意思是 8KB,但我承认我主要是在编造那部分。 知道了,回到原来的向量。以供将来参考,有没有办法强制将非动态数组放在堆上而不是堆栈上? @Hoyt: int* ptr = new int[1000000]; /* f(ptr); */ delete[] ptr; @Hoyt:原则上它取决于操作系统,实际上它是由加载程序动态分配的。可执行文件包含需要多少内存的元数据,并且当加载可执行文件时,它会被赋予正确的数量。没有操作系统的正确嵌入系统的编译器可能会将设备的全部资源专用于一个程序,因此可以决定将静态数据放在哪个物理地址并配置malloc从其他地方分配。

以上是关于大数组的堆栈溢出但没有同样大的向量?的主要内容,如果未能解决你的问题,请参考以下文章

C++:在堆上分配一个大的可变大小的二维向量

递归代码在数组列表偏大的情况下会导致堆栈溢出。一个解决办法

创建大型数组时,线程“<main>”已溢出其堆栈

C语言画图理解堆栈溢出

预先在运行时检测堆栈溢出

声明大数组时出现堆栈溢出异常