【问题标题】:Maximum size of malloc() [duplicate]malloc() 的最大大小 [重复]
【发布时间】:2012-10-23 12:58:37
【问题描述】:

可能重复:
maximum memory which malloc can allocate!

我怎么知道malloc()可以占用的最大堆大小。 我使用 MS Visual Studio 2010。

【问题讨论】:

  • 不清楚你在问什么。您是否想要 malloc() 在给定无限内存的情况下可以分配的最大大小,还是您想知道如何计算您运行的系统中有多少内存可用?
  • 您最多可以询问 SIZE_MAX,但这几乎肯定会失败。您可以成功获得多少取决于许多因素(32 位还是 64 位、C 运行时版本、操作系统版本、最大页面文件大小、可用物理内存等)。

标签: c visual-studio malloc heap-memory


【解决方案1】:

有一些依赖于操作系统的方法可以确定您的进程有多少虚拟内存可用,但我不知道如何在 Windows 上执行此操作。但是,您可以通过进行一次搜索+减半搜索,使用更大的参数调用 malloc 直到它失败,然后返回它所拒绝的值来找到它。类似的东西

for(i=1; v=malloc(i); i<<=1) free(v);

此时您知道 i/2 字节是可以的,而 i 字节是不可以的。现在对实际最大值进行二分搜索:

for(a=(i>>1), b=i; a < b-1;)
{
    c=(a+b)>>1;
    if(v=malloc(c)) { a=c; free(v); }
    else b=c;
}

此时,a 是您可以成功分配的最大金额。

【讨论】:

  • 我对此投了赞成票,因为我过去确实这样做过(虽然不是那么简洁 - 干得好!)。我在 Windows 7 上使用 GCC 4.8 使用 new/delete 而不是 malloc/free 在 C++ 中完成了它。结果?我在一个块中分配了 1,953,169,376 个字节,并成功地用值填充了它,然后访问了这些值 - 简而言之,它可以工作。
  • 请注意,Linux 内核经常会过度使用内存,这可能会导致错误或交换延迟。这不是在 Linux 上执行此操作的可靠方法。
【解决方案2】:

好吧,为什么不看看它的论点...size_t。因此,您可以分配size_t 范围内的任何内容(SIZE_MAX 也可以,但无论如何它都基于size_t,如果不是,mallocs 签名仍然是您必须要做的处理)。

您的问题有点不清楚,但是如果您实际上是在问最大堆大小是多少,那么理论上,它是由本机指针大小决定的。例如,在 32 位系统上,指针可以保存 0 到 2^32-1 之间的任何地址(当然,地址 0 通常不是有效的)。

当然,在实践中,必须考虑一些细节,其中大部分是特定于操作系统的。机器中安装了多少物理内存 (RAM)?如果您的操作系统使用虚拟地址,那么这会使事情变得复杂,因为您不再受物理 RAM 的限制(尽管性能会随着不断的分页而急剧下降)。

在考虑您的程序可以在给定平台上分配多少时,这有助于了解 virtual address space 的工作原理。

【讨论】:

  • 我认为 OP 想知道他/她实际上可以分配多少内存——也就是说,有多少内存可以安全分配。
  • @Caleb:是的,我想知道这一点。我补充一点,
猜你喜欢
  • 1970-01-01
  • 2010-11-07
  • 1970-01-01
  • 2012-10-31
  • 1970-01-01
  • 2015-09-17
  • 1970-01-01
  • 1970-01-01
  • 2014-07-23
相关资源
最近更新 更多