可能重复:
maximum memory which malloc can allocate!的malloc的最大尺寸()
我怎么能知道堆我可以malloc()
占据的最大尺寸。 我使用MS Visual Studio 2010.
可能重复:
maximum memory which malloc can allocate!的malloc的最大尺寸()
我怎么能知道堆我可以malloc()
占据的最大尺寸。 我使用MS Visual Studio 2010.
有操作系统相关的方法来找出有多少虚拟内存可用于您的过程,但我不知道如何在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在C++中使用new/delete代替malloc/free。结果?我在一个块中分配了1,953,169,376个字节,并成功用值填充,然后访问这些值 - 简而言之,它可以工作。 – rmcghee
那么,为什么不看看它的论点...... size_t
。因此,您可以分配size_t
(SIZE_MAX
)作品中的任何内容,但无论如何它都基于size_t
,如果不是,则为malloc
s签名仍然是您必须处理的内容。
你的问题有点不清楚,但如果你真的在问什么是最大堆大小,理论上它是由本地指针大小决定的。例如,在32位系统上,指针可以保存0到2^32-1之间的任何地址(当然,地址0通常不是有效的)。
当然,在实践中,还有一些必须考虑的细节,其中大多数是操作系统特定的。机器中安装了多少物理内存(RAM)?如果你的操作系统使用虚拟地址,那么这会让事情变得复杂,因为你不再受物理内存的限制(虽然性能会随着分页不断而下降)。
它有助于了解virtual address space在思考您的程序可以在给定平台上分配多少时的工作方式。
目前还不清楚你在问什么。你是否希望malloc()可以分配的最大大小给予无限的内存,或者你是否问如何确定在你运行的系统中有多少内存可用? – Caleb
您可以*询问* SIZE_MAX,但几乎肯定会失败。您可以成功获得多少*取决于许多因素(32位与64位,C运行时版本,操作系统版本,最大页面文件大小,可用物理内存等)。 –