C-malloc的最大申请数量会受到哪些因素的影响?
malloc的最大申请数量会受到哪些因素的影响?每次malloc的最大量是固定的吗?
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
malloc的最大申请数量会受到哪些因素的影响?每次malloc的最大量是固定的吗?
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
接受
或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
发布评论
评论(4)
首先是地址线的位数,曾经看过一本书上面做过实验。在32位的操作系统上,也就是虚拟内存是4G。但是其中2G操作系统用了,这个环境下,不存在动态映射等情况下,可以申请的空间是1.95G。但是如果程序很大,代码区占的地方比较大,或者有些区被动态映射到其他地方了(这个描述的不是很专业 - -)。并且有一些操作系统,为了防止恶意攻击,采取了一种随机地址空间分布的技术,导致进程堆空间变小,可以分配的地方也就少了
malloc 申请的内存是在堆区的。
堆的大小没有什么具体数值,看机器的运行状况,配置状况而定。
当程序的堆大小确定时,malloc 可以分配的最大大小还是不确定,因为 malloc 必须分配一块连续的空间,这时候可以申请的最大内存是当前堆中最大连续空间的内存大小。
所以,每次 malloc 的最大量是不固定的。
一次申请的最大内存和运行的平台有关系。它申请的是连续内存空间,机器的RAM以及虚拟内存、机器运行的其他程序所使用的内存大小有关。而且每次运行的结果可能都不同。
需要注意的是,malloc的参数类型是size_t,其取值范围是[0,MAX_SIZE]。但是往往实际能够申请到的内存大小远远小于MAX_SIZE。
可以写个程序测试下:
#include <stdio.h>
#include <stdlib.h>
static void *malloc_wrap(size_t size)
{
void *p = malloc(size);
if (p) {
printf("Allocated %lu bytes from %p to %pn", size, p, p + size);
}
else {
printf("Failed to allocated %lu bytesn", size);
}
return p;
}
int main()
{
size_t step = 0x1000000;
size_t size = step;
size_t best = 0;
while (step > 0)
{
void *p = malloc_wrap(size);
if (p) {
free(p);
best = size;
}
else {
step /= 0x10;
}
size += step;
}
void *p = malloc_wrap(best);
if (p) {
//pause();
return 0;
}
else {
return 1;
}
}
运行结果:
malloc分配内存的具体数值会受到操作系统版本、程序本身大小、用到的动态/共享库数量、大小、程序栈数量、大小等,甚至有可能每次运行的结果都会不同。