赞
踩
下面给出一段代码:
- //malloc最多能分配多大的空间?
- #include<stdio.h>
- #include<stdlib.h>
- int main()
- {
- int count = 0;
- while (malloc(1 << 20))//一次性分配1M的内存空间
- {
- count++;
- }
- printf("%d\n", count);
- return 0;
- }
这段代码在linux的环境下的结果大约为3G;但是这个结果收到系统环境的影响。
下面这段代码来自《程序员的自我修养》,
- //《程序员的自我修养》
- #include <stdio.h>
- #include <stdlib.h>
- int count = 0;
- void *p = NULL;
- int main(int argc, char *argv[])
- {
- int blocksize[4] = { 1024 * 1024 * 1024, 1024 * 1024, 1024, 1 };
- int i, j;
- for (i = 0; i<4; ++i)
- {
- for (j = 1; ; ++j)
- {
- if (NULL == (p = malloc(count + blocksize[i])))
- {
- printf("%d\n", j); break;
- }
- count += blocksize[i];
- free(p);
- }
- }
- printf("mallocmaxmemory:%d\n", count);
- return 0;
- }
下面是来自知乎的讲解:
地址空间限制是有的,但是malloc通常情况下申请到的空间达不到地址空间上限。内存碎片会影响到你“一次”申请到的最大内存空间。比如你有10M空间,申请两次2M,一次1M,一次5M没有问题。但如果你申请两次2M,一次4M,一次1M,释放4M,那么剩下的空间虽然够5M,但是由于已经不是连续的内存区域,malloc也会失败。系统也会限制你的程序使用malloc申请到的最大内存。Windows下32位程序如果单纯看地址空间能有4G左右的内存可用,不过实际上系统会把其中2G的地址留给内核使用,所以你的程序最大能用2G的内存。除去其他开销,你能用malloc申请到的内存只有1.9G左右。
作者:Cascade
链接:https://www.zhihu.com/question/20836462/answer/16341442
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。