您的位置:首页 > 其它

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

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

点击(此处)折叠或打开

#include <iostream>

#include <stdio.h>

#include <stdlib.h>

int64_t maximum = 0;

using namespace std;

int main()

{

    cout<<"sizeof(void*) is:"<<(int)sizeof(void*)<<endl;

    cout<<"sizeof(int) is:"<<sizeof(int)<<endl;

    int64_t blocksize[] = {1024*1024, 1024, 1};

    int64_t i, count;

    for(i=0;i<3;i++)

       {

        maximum = 0;

        for(count=1;;count++)

            {

                void *block = (void*)malloc(maximum + blocksize[i] * count);

                if(block)

                    {

                        maximum = maximum + blocksize[i] *count;

                        free(block);

                    }

                else

                    {

                        break;

                    }

            }

         cout << "maxmium malloc size:"<<maximum/1000000<<"M"<<endl;

         }

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

    return 0;

}

程序输出如下:



这个结果是不是很蹊跷,我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位的程序。

阅读(1930) | 评论(4) | 转发(6) |

0
上一篇:Linux进程调度CFS算法实现分析

下一篇:C++中关于全局对象的初始化顺序

相关热门文章
车虫会黑你多少钱

华美远航(北京)投资有限公司...

SEO实际上是需要时间的投入的...

随笔

大小端以及网络传输过程中的问...

test123

编写安全代码——小心有符号数...

使用openssl api进行加密解密...

一段自己打印自己的c程序...

sql relay的c++接口

socket编程开启混杂模式的目的...

C++ 嵌套类是干什么的?...

C++ 单例怎么写?

sizeof 这个操作符都有什么特...

Oracle VM server 如何删除vm ...

给主人留下些什么吧!~~





myth_liu2013-07-18 23:30:24
要明白一件事情,你没有在malloc后马上使用该内存,malloc后马上memset一下,你就会发现有什么不同了!
希望你可以实践一下!
回复 | 举报





fuliangcheng2013-07-16 19:37:07
恩,谢谢,编译器是多少位的默认编译的就是多少位的程序,特别是windows下的mingw只能编译32位的程序
回复 | 举报





luckysym2013-07-16 09:45:56
32位编译器也能编出64位程序,所以并不在于编译器本身是多少位,而是编译器是否支持64位以及编译选项
回复 | 举报

评论热议
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: