Malloc最多一次能分配多少内存



原文地址:Malloc最多一次能分配多少内存 作者:fuliangcheng

相信C/C++程序员都用过这个库函数, 这个函数时程序员申请堆中的内存,需要自己手动释放内存,所以这个函数也是Memory Leak的根源。但是malloc一次最多能申请多少内存呢,显然这个跟我们物理内存的大小和
我们的系统,编译器都有一定的关系。已经不记得之前在哪里遇到过这个问题,今天忽然想起来了,于是自己做了个实验。
我的开发环境是Windows7 64位,内存8G,IDE是codeblocks,支持开源,下面是测试代码:

点击(此处)折叠或打开

  1. #include <iostream>
  2. #include <stdio.h>
  3. #include <stdlib.h>
  4. int64_t maximum = 0;


  5. using namespace std;
  6. int main()
  7. {
  8.     cout<<"sizeof(void*) is:"<<(int)sizeof(void*)<<endl;
  9.     cout<<"sizeof(int) is:"<<sizeof(int)<<endl;
  10.     int64_t blocksize[] = {1024*1024, 1024, 1};
  11.     int64_t i, count;
  12.     for(i=0;i<3;i++)
  13.        {
  14.         maximum = 0;
  15.         for(count=1;;count++)
  16.             {
  17.                 void *block = (void*)malloc(maximum + blocksize[i] * count);
  18.                 if(block)
  19.                     {
  20.                         maximum = maximum + blocksize[i] *count;
  21.                         free(block);
  22.                     }
  23.                 else
  24.                     {
  25.                         break;
  26.                     }
  27.             }
  28.          cout << "maxmium malloc size:"<<maximum/1000000<<"M"<<endl;
  29.          }


  30.     cout << "Hello world!" << endl;

  31.     return 0;
  32. }

程序输出如下:

这个结果是不是很蹊跷,我64位的系统,而且8G的内存,占用了很少,但是这里为什么只分配了2G不到呢,我原来的推想是操作系统保留一部分内存(大概2G),还有差不多6G可以申请,所以这个结果让我很惊讶。于是我又在64bit的linux下,内存4G,用同样代码进行了测试,这次输出是


这次输出似乎跟预想差不多,4G内存能分配3.5G左右,那么windows下是什么问题导致我8G的内存只能malloc 2G不到呢。细想一下,觉得肯定是编译器的问题,果然我的codeblocks默认的编译器是mingw-32-g++,可能细心的读者已经看到前面的sizeof(void*)的值是4,也就是说在windows下codeblock下默认将该程序编译成32位的了,所以才会出现分配2G不到的内存,感兴趣的可以用其他的64位的编译器测试一下,应该会得到正常值。

 

总结一下:

程序是32位或者是64位并不是由你的操作系统决定,而是编译器决定,准确的说是决定于编译器和编译选项,64位系统照样可以跑32位的程序。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值