malloc 最大可以分配多大内存

2023-10-23 14:59

本文主要是介绍malloc 最大可以分配多大内存,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

引用: http://topic.csdn.net/u/20080801/01/2fa67f5e-3d2a-4d58-8b3d-a1fd36988458.html
要做高速图像处理,用到大缓存,好像malloc做到644MB就上顶了,645MB就会获得空指针

malloc的上限到底是多少啊?

系统:内存2GB,XP sp2系统,BDS 2007 w/ sp1
100  修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • dxkh
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-01 07:44:171楼 得分:0
分配内存用new看看
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • cczlp
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
  • 4

发表于:2008-08-01 08:32:472楼 得分:20
32位程序上,理论上 <4G.
另外,你说的“高速”是什么概念,内存这麽大,都是分配到硬盘上,不可能很快, 还是改进算法吧
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • thwen0101
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-01 08:41:203楼 得分:0
理论上是 <4G,不足到硬盘分
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • gtenfghg
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-01 08:52:454楼 得分:0
该回复于2008-08-01 14:39:37被版主删除
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • akirya
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
  • 6

发表于:2008-08-01 09:32:495楼 得分:5
windows核心编程上的东西说 ,大概在2G多一些
你用API分配内存试试看 ,可能是找不到连续的 那么大内存的空间
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • jacknes009
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-01 09:46:556楼 得分:5
理论上是 <4G,不足到硬盘分

你用NEW试试。。。
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • yuanreid
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-01 10:58:187楼 得分:5
我试过VirtualAlloc最大也是只能分配到600多M,但看到有人可以分配到1G。也是不解。也许跟系统参数配置有关。
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • songhtao
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
  • 3

    2

发表于:2008-08-01 14:19:168楼 得分:0
windows下用户进程空间是2G因此肯定比2G要小
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • host88888
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-02 08:46:479楼 得分:0
该回复于2008-08-02 12:36:14被版主删除
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • jacknes009
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-02 09:10:2010楼 得分:0
LZ有结果了嘛???
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • yf2100
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-02 15:45:3511楼 得分:0
还没有到其它机器上测试,理论上我的机器除了跑BDS,VS,LV之外,没有别的东西,刚启动完成时内存占用300M左右(具体多少忘了,去办公室才能看见),也就是说剩余的1.7G内存中连续的内存块最大才644M,这有点太不可思议了,如果真的是这样,那XP的内存管理太烂了!
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • yf2100
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-02 15:46:2012楼 得分:0
引用 1 楼 dxkh 的回复:
分配内存用new看看
New和malloc在可获得内存容量上应该内有太大区别吧
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • yf2100
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-02 15:47:0813楼 得分:0
new和malloc在可获得内存容量上应该没有太大区别吧
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • yf2100
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-02 15:47:4414楼 得分:0
有没有兄弟愿意帮忙试试?
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • akirya
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
  • 6

发表于:2008-08-02 16:00:3515楼 得分:10
在我机器上运行成功,
我机器1G内存。
C/C++ code
           
#include<windows.h> int main(int argc,char **argv) { LPVOID lpVoid = VirtualAlloc( 0 , 1024*1024*1986 , MEM_COMMIT , PAGE_READWRITE); if( lpVoid ){ printf("分配成功/n"); Sleep(1000*15); VirtualFree( lpVoid , 1024*1024*1986 , MEM_RELEASE ); }else{ printf("分配失败/n"); } return 0; }
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • yf2100
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-02 16:01:5716楼 得分:0
引用 2 楼 cczlp 的回复:
32位程序上,理论上 <4G.
另外,你说的“高速”是什么概念,内存这麽大,都是分配到硬盘上,不可能很快, 还是改进算法吧
牛人进来先拜一下:)

...内存绝对要这么大的,用途比较特殊,要求速度越快越好的场合,不便细说,仔细考虑了,算法优化我也想过,可能多缓冲区的做法能行,但我真的不想这么做:(
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • yf2100
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-02 16:04:5717楼 得分:0
引用 15 楼 akirya 的回复:
在我机器上运行成功,
我机器1G内存。

C/C++ code
#include <windows.h>
int main(int argc,char **argv)
{
    LPVOID lpVoid = VirtualAlloc( 0 , 1024*1024*1986 , MEM_COMMIT , PAGE_READWRITE);
    if( lpVoid ){
        printf("分配成功/n");
        Sleep(1000*15);
        VirtualFree( lpVoid , 1024*1024*1986 , MEM_RELEASE );
    }else{
        printf("分配失败/n");
    }
    return 0;
}

VirtualAlloc是不是把虚拟内存也用上了?这样的话好像保证不了速度啊
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • akirya
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
  • 6

发表于:2008-08-02 16:08:2618楼 得分:10
你看一下windows核心编程吧,里面有讲如何分配到将近3G的内存方法
这是其中的一段

当我最初观察32位进程的地址空间的时候,我惊奇地发现可以使用的地址空间还不到我的
进程的全部地址空间的一半。难道内核方式分区真的需要上面的一半地址空间吗?实际上回答
是肯定的。系统需要这个地址空间,供内核代码、设备驱动程序代码、设备I/O高速缓存、非
页面内存池的分配和进程页面表等使用。实际上Microsoft将内核压缩到这个2GB空间之中。在
64位Windows2000中,内核终于得到了它真正需要的空间。
1.在x86的Windows2000中获得3GB用户方式分区
多年来,编程人员一直强烈要求扩大用户方式的地址空间。为了满足这个需要,Microsoft
允许x86的Windows2000AdvancedServer版本和Windows2000DataCenter版本将用户方式分
区扩大为3GB。若要使所有进程都能够使用3GB用户方式分区和1GB内核方式分区,必须将
/3GB开关附加到系统的BOOT.INI文件的有关项目中。表13-1中的“32位Windows2000(x86
w/3GB用户方式)”这一列显示了使用3GB开关时它的地址空间是个什么样子。
在Microsoft添加/3GB开关之前,应用程序无法看到设置了高位的内存指针。一些有创意
的编程员自己将这个高位用作一个标志,这个标志只对他们的应用程序具有意义。这时,当应
用程序访问内存地址时,运行的代码将在内存地址被使用之前清除该指针的高位。可以想象,
第13章Windows的内存结构计计301
下载
当应用程序在3GB的用户方式环境中运行时,该应用程序转眼之间就会运行失败。
Microsoft不得不提出一个解决方案,以便使该应用程序能够在3GB环境中运行。当系统准备
运行一个应用程序时,它要查看该应用程序是否与/LARGEADDRESSAWARE链接程序开关相链接。
如果是链接的,那么应用程序就声称它并没有对内存地址执行什么特殊的操作,并且完全准备充
分利用3GB用户方式地址空间。另一方面,如果该应用程序没有与/LARGEADDRESSAWARE开
关相链接,那么操作系统将保留0x80000000至0xBFFFFFFF之间的1GB区域。这可以防止在已
经设置了高位的内存地址上进行内存分配。
注意,内核已经被紧紧地压缩到了一个2GB的分区中。当使用3GB的开关时,内核勉强地
被放入一个1GB的分区中。使用/3GB的开关,可以减少系统能够创建的线程、堆栈和其他资
源的数量。此外,系统最多只能使用16GB的RAM,而通常情况下最多可以使用64GB的RAM,
因为内核方式中没有足够的虚拟地址空间可以用来管理更多的RAM。
注意当操作系统创建进程的地址空间时,需要检查一个可执行的LARGEADDRE
SSAWARE标志。对于DLL,系统则忽略该标志。在编写DLL时,必须使之能够在3
GB用户方式分区中正确地运行,否则它们的行为特性是无法确定的
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • wufanghua
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-02 23:49:4919楼 得分:5
这个进程内存应该和电脑内存没有多大的关联吧。
再说你那个是一次分配,没有这么大的连续的空间而已。
你可以在程序一开始就分配,这样成功概率大一点。
不然就分多次分配,然后用一个结构管理一下,这个管理结构用类封装一下,正常的操作在里面用接口重新实现一下,在类外面使用上也感觉不出来,也应该不会影响你的使用的。
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • Behard
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-03 22:00:5820楼 得分:10
没有具体研究过,不过几种编译器是不一样的
我的电脑:XP SP2 物理3G内存,显示为 2.75G
BCB 5 malloc 能分配 1435M, BDS2007 能分配 720M
VC6 能分配 700 多M, VS 2005 没有测试
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • yf2100
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-23 22:00:0321楼 得分:0
感谢楼上的兄弟

我抽时间做了个简单的测试:
同一台机器,E6320,2G,XP w/sp2
C++ builder 2007 最大可分配644MB
VC 2005 最大可分配1.16GB

omg,BDS2007的内存管理太烂了!
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • yf2100
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-23 22:00:3322楼 得分:0
突然发现自己有三条裤衩了:p
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • unsigned
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
  • 3

    2

    5

发表于:2008-08-23 23:20:2323楼 得分:0
引用 21 楼 yf2100 的回复:
感谢楼上的兄弟

我抽时间做了个简单的测试:
同一台机器,E6320,2G,XP w/sp2
C++ builder 2007 最大可分配644MB
VC 2005 最大可分配1.16GB

omg,BDS2007的内存管理太烂了!

如果你怀疑是RTL的问题,那试一下HeapAlloc,这个是Windows API跟C的RTL没有任何直接关系.
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • unsigned
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
  • 3

    2

    5

发表于:2008-08-23 23:22:0624楼 得分:20
关于Windows各版本的内存限制,可以参看下面页面的表格:
Memory Limits for Windows Releases
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • unsigned
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
  • 3

    2

    5

发表于:2008-08-23 23:27:4625楼 得分:0
Windows各内存分配接口的差别:http://msdn.microsoft.com/en-us/library/aa366533(VS.85).aspx
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • yf2100
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-24 12:23:1126楼 得分:0
引用 25 楼 unsigned 的回复:
Windows各内存分配接口的差别:http://msdn.microsoft.com/en-us/library/aa366533(VS.85).aspx
en,这个有用,受教了~谢谢~继续学习中....

本帖不急着结,等俺研究出成果来再说:)

欢迎各位大侠继续指教!
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • ouygg
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-26 11:48:0227楼 得分:0
多次申请。每次500M。
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • yf2100
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-26 12:05:5028楼 得分:0
引用 27 楼 ouygg 的回复:
多次申请。每次500M。
管理起来太麻烦,呵呵
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • unsigned
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
  • 3

    2

    5

发表于:2008-08-26 13:18:0829楼 得分:10
以前讨论VirtualAlloc的贴子:
http://topic.csdn.net/u/20080128/09/c2678506-4193-4bfe-aaef-1c2b30520245.html
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • yf2100
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-08-26 17:03:5230楼 得分:0
引用 29 楼 unsigned 的回复:
以前讨论VirtualAlloc的贴子:
http://topic.csdn.net/u/20080128/09/c2678506-4193-4bfe-aaef-1c2b30520245.html

嗯,看了很有收获,已经mark了

好在我这里的内存分配申请不是很频繁,不用担心碎片和核心内存耗尽的问题:)
修改 删除 举报 引用 回复
进入用户个人空间
加为好友
发送私信
在线聊天
  • likang8677
  • 等级:
  • 可用分等级:
  • 总技术分:
  • 总技术分排名:
发表于:2008-11-07 18:17:4531楼 得分:0
不错的帖子,呵呵

这篇关于malloc 最大可以分配多大内存的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/268586

相关文章

NameNode内存生产配置

Hadoop2.x 系列,配置 NameNode 内存 NameNode 内存默认 2000m ,如果服务器内存 4G , NameNode 内存可以配置 3g 。在 hadoop-env.sh 文件中配置如下。 HADOOP_NAMENODE_OPTS=-Xmx3072m Hadoop3.x 系列,配置 Nam

poj 3723 kruscal,反边取最大生成树。

题意: 需要征募女兵N人,男兵M人。 每征募一个人需要花费10000美元,但是如果已经招募的人中有一些关系亲密的人,那么可以少花一些钱。 给出若干的男女之间的1~9999之间的亲密关系度,征募某个人的费用是10000 - (已经征募的人中和自己的亲密度的最大值)。 要求通过适当的招募顺序使得征募所有人的费用最小。 解析: 先设想无向图,在征募某个人a时,如果使用了a和b之间的关系

poj 3258 二分最小值最大

题意: 有一些石头排成一条线,第一个和最后一个不能去掉。 其余的共可以去掉m块,要使去掉后石头间距的最小值最大。 解析: 二分石头,最小值最大。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <c

poj 2175 最小费用最大流TLE

题意: 一条街上有n个大楼,坐标为xi,yi,bi个人在里面工作。 然后防空洞的坐标为pj,qj,可以容纳cj个人。 从大楼i中的人到防空洞j去避难所需的时间为 abs(xi - pi) + (yi - qi) + 1。 现在设计了一个避难计划,指定从大楼i到防空洞j避难的人数 eij。 判断如果按照原计划进行,所有人避难所用的时间总和是不是最小的。 若是,输出“OPETIMAL",若

poj 2135 有流量限制的最小费用最大流

题意: 农场里有n块地,其中约翰的家在1号地,二n号地有个很大的仓库。 农场有M条道路(双向),道路i连接着ai号地和bi号地,长度为ci。 约翰希望按照从家里出发,经过若干块地后到达仓库,然后再返回家中的顺序带朋友参观。 如果要求往返不能经过同一条路两次,求参观路线总长度的最小值。 解析: 如果只考虑去或者回的情况,问题只不过是无向图中两点之间的最短路问题。 但是现在要去要回

poj 2594 二分图最大独立集

题意: 求一张图的最大独立集,这题不同的地方在于,间接相邻的点也可以有一条边,所以用floyd来把间接相邻的边也连起来。 代码: #include <iostream>#include <cstdio>#include <cstdlib>#include <algorithm>#include <cstring>#include <cmath>#include <sta

poj 3422 有流量限制的最小费用流 反用求最大 + 拆点

题意: 给一个n*n(50 * 50) 的数字迷宫,从左上点开始走,走到右下点。 每次只能往右移一格,或者往下移一格。 每个格子,第一次到达时可以获得格子对应的数字作为奖励,再次到达则没有奖励。 问走k次这个迷宫,最大能获得多少奖励。 解析: 拆点,拿样例来说明: 3 2 1 2 3 0 2 1 1 4 2 3*3的数字迷宫,走两次最大能获得多少奖励。 将每个点拆成两个

poj 3692 二分图最大独立集

题意: 幼儿园里,有G个女生和B个男生。 他们中间有女生和女生认识,男生男生认识,也有男生和女生认识的。 现在要选出一些人,使得这里面的人都认识,问最多能选多少人。 解析: 反过来建边,将不认识的男生和女生相连,然后求一个二分图的最大独立集就行了。 下图很直观: 点击打开链接 原图: 现图: 、 代码: #pragma comment(

最大流、 最小费用最大流终极版模板

最大流  const int inf = 1000000000 ;const int maxn = 20000 , maxm = 500000 ;struct Edge{int v , f ,next ;Edge(){}Edge(int _v , int _f , int _next):v(_v) ,f(_f),next(_next){}};int sourse , mee

二分最大匹配总结

HDU 2444  黑白染色 ,二分图判定 const int maxn = 208 ;vector<int> g[maxn] ;int n ;bool vis[maxn] ;int match[maxn] ;;int color[maxn] ;int setcolor(int u , int c){color[u] = c ;for(vector<int>::iter