2

有什么方法可以扩大 C++ 程序的堆大小吗?在android中,您可以通过在清单文件中将其声明为大来轻松做到这一点。

当我尝试在堆上分配十亿个数组元素时遇到了这个问题。

int main() {
 int size = 1000000000;
 int* nmbr = new int[size];
 return 0;
}
4

2 回答 2

3

C++ 本身并不知道“堆”是什么。这是一个实现问题,因此您必须查看编译器的文档。以下是 Google 搜索“MSVC 堆大小标志”时发现的内容:

http://msdn.microsoft.com/en-us/library/f90ybzkh.aspx

引用 MSDN 页面:

/HEAP 选项设置堆的大小(以字节为单位)。此选项仅在构建 .exe 文件时使用。

于 2014-04-01T19:26:44.477 回答
2

通常堆大小是特定于实现的,并且取决于您使用的编译器。查看文档,大多数都提供了一种更改堆大小的方法。

给你一个更笼统的答案:

堆可以是任意大小,您无法将其与您的计算机内存进行比较。仅仅因为您的计算机可能有 4GB 内存并不意味着每个程序都可以使用这么多内存。MS Visual C++ 中的默认堆大小为 1MB,但您的程序在运行时仍将使用超过 1MB 的空间。您的程序消耗的内存还包括堆栈内存、操作系统使用的句柄和线程,最后但并非最不重要的是程序代码及其包含的所有字符串和其他文字。

分配内存的主要问题是如何解决它。这是 x86 和 x64 架构之间的主要区别。在 32 位 Windows 操作系统上,您的程序通常只有 2GB 可用虚拟内存(或 3GB 特殊设置)。

总有一天你会注意到即使有足够的空间,你也会得到 Out of memory-errors。如果运行时内存非常碎片化,以至于运行时无法满足任何地方之间的请求量并且通常是由频繁的内存泄漏引起的,则可能会发生这种情况。为避免这种情况,需要大量内存的应用程序将在执行任何实际工作之前尝试将其分配为大块,并且将具有某种内存管理来自行处理分配(SQL 数据库可能会这样做)。这样他们就可以根据需要重新排列内存中的数据。有多种方法可以做到这一点,在 Windows 中您可能会使用VirtualAlloc或其他形式的分配。

于 2014-04-01T19:55:31.793 回答