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位以及编译选项
回复 | 举报
评论热议
我们的系统,编译器都有一定的关系。已经不记得之前在哪里遇到过这个问题,今天忽然想起来了,于是自己做了个实验。
我的开发环境是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位以及编译选项
回复 | 举报
评论热议
相关文章推荐
- Malloc最多一次能分配多少内存
- malloc最多能分配多少内存
- malloc(0)分配多少内存?(译文)
- 【总结】malloc最多能分配多大的内存空间?
- vs 2010 express 查看malloc能分配多少内存
- vs 2010 express 查看malloc能分配多少内存
- vs 2010 express 查看malloc能分配多少内存
- C++内存分配秘籍—new,malloc,GlobalAlloc详解
- new和malloc分配的内存是否连续
- C++内存分配秘籍—new,malloc,GlobalAlloc的区别与详解
- C/C++ 内存分配方式,堆区,栈区,new/delete/malloc/free
- C++内存分配秘籍 -- new,malloc,GlobalAlloc详解
- Linux 内存分配,malloc(), free(),calloc(),realloc()用法
- C++内存分配秘籍—new,malloc,GlobalAlloc详解
- malloc的内存分配原理
- C++中malloc/free与new/delete的区别及内存分配失败错误处理
- C语言中多维数组的内存分配和释放(malloc与free)(转)
- FFmpeg函数简单分析:内存的分配和释放(av_malloc()、av_free()等)
- C语言:使用realloc函数对malloc或者calloc动态分配的内存大小进行扩展
- [转]内存分配函数 _alloc/malloc/calloc