【问题标题】:Enlarge heapsize c++放大堆大小 C++
【发布时间】:2014-05-12 17:34:07
【问题描述】:

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

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

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

【问题讨论】:

  • 为什么要分配 4 GB 内存?在 32 位机器上,这甚至是不可能的。
  • @JoachimPileborg - 1) 有兴趣学习 2) 如果尺寸非常大,寻呼机不会处理吗? :-)
  • 只需将您的代码编译为x64 或使用一些 os api 来分配大量内存
  • 工作正常。延迟分配的虚拟内存非常便宜。

标签: c++ heap-memory heap-size


【解决方案1】:

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

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

引用自 MSDN 页面:

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

【讨论】:

  • /HEAP 标志与问题无关。它只控制初始大小/保留,对最大大小没有影响。
  • 您不能使用该选项将初始大小设置为非常大的值吗?听起来与我有关,@Andrew。
  • 没必要。堆将根据需要自动增长(达到进程地址空间、运行时库等施加的限制)。将初始大小设置为较大的值不会改变堆的大小。
【解决方案2】:

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

给你一个更笼统的答案:

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

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

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

【讨论】:

  • 谢谢好答案 - 但我不明白碎片来自哪里?进程的页面映射到内存中的帧。最后一帧只能有(外部)碎片。
  • 我很确定您的程序不会因为碎片而失败,在您的情况下,主要原因是您根本无法使用常规堆分配在 32 位程序中分配 ~4GB 的动态内存. Windows(以及其他操作系统)限制了程序可用的虚拟空间量(通常在 32 位系统上约为 2-3GB)。尝试用char 数组替换int 数组,它可能会工作,因为它只会分配~1GB 的内存。
猜你喜欢
  • 2011-08-01
  • 2015-02-13
  • 2010-12-22
  • 2018-04-14
  • 2018-06-29
  • 1970-01-01
  • 2020-08-03
  • 2010-12-29
相关资源
最近更新 更多