可能的重复:
Malloc可以分配的最大记忆!
我怎么知道我可以占用malloc()
的堆的最大尺寸。我使用MS Visual Studio2010。
有一些与操作系统相关的方法可以找出可用于过程的虚拟内存,但我不知道如何在Windows上执行此操作。但是,您可以通过进行狩猎 减半搜索,用更大的论点镇定马洛克,直到失败,然后将其归为其价值,从而找到它。像
for(i=1; v=malloc(i); i<<=1) free(v);
至此,您知道i/2个字节还可以,而我的字节还不对。现在对实际最大搜索进行二等搜索:
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
是您可以成功分配的最大数量。
好吧,为什么不只是查看其参数... size_t
。因此,您可以在size_t
范围内分配任何内容(SIZE_MAX
也可以使用,但是它基于size_t
,并且事件,如果不是,则malloc
S签名仍然是您必须处理的)。
您的问题有点不清楚,但是如果您实际上在问最大堆大小,那么从理论上讲,它是由本机指针大小确定的。例如,在32位系统上,指针可以保持0和2^32-1之间的任何地址(当然,地址0无效)。
当然,实际上,必须考虑一些细节,其中大多数是特定于操作系统的。机器中安装了多少物理内存(RAM)?如果您使用虚拟地址,那么这会使事情复杂化,因为您不再受到物理RAM的限制(尽管性能会掉落不断的分页悬崖)。
当思考您的程序可以在给定平台上分配多少时,它有助于了解虚拟地址空间的工作方式。