malloc 最大可以分配多大内存?(BDS2007)

yf2100 2008-08-01 01:50:10
要做高速图像处理,用到大缓存,好像malloc做到644MB就上顶了,645MB就会获得空指针

malloc的上限到底是多少啊?

系统:内存2GB,XP sp2系统,BDS 2007 w/ sp1
...全文
1785 33 打赏 收藏 转发到动态 举报
写回复
用AI写文章
33 条回复
切换为时间正序
请发表友善的回复…
发表回复
quency1 2011-10-16
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 akirya 的回复:]

你看一下windows核心编程吧,里面有讲如何分配到将近3G的内存方法
这是其中的一段

当我最初观察32位进程的地址空间的时候,我惊奇地发现可以使用的地址空间还不到我的
进程的全部地址空间的一半。难道内核方式分区真的需要上面的一半地址空间吗?实际上回答
是肯定的。系统需要这个地址空间,供内核代码、设备驱动程序代码、设备I/O高速缓存、非
页面内存池的分配和进程页面表等使用。实际上M……
[/Quote]

akirya的意思是 Microsoft规定用户在每个进程中分配的地址必须小于2G吗?
我的程序中需要分配大概4G的内存,无论用malloc还是virtualMalloc都不能一次分配成功,因此我分10次分配(即调用10次virtualMalloc),前3次分配成功(大概1.2G),后面就无法成功了,这跟“Microsoft规定用户在每个进程中分配的地址必须小于2G”有关吗?有没有解决方法呢?
w20011025 2010-08-25
  • 打赏
  • 举报
回复
x不错的帖子,呵呵
likang8677 2008-11-07
  • 打赏
  • 举报
回复
不错的帖子,呵呵
yf2100 2008-08-26
  • 打赏
  • 举报
回复
[Quote=引用 27 楼 ouygg 的回复:]
多次申请。每次500M。
[/Quote]管理起来太麻烦,呵呵
痞子酷 2008-08-26
  • 打赏
  • 举报
回复
多次申请。每次500M。
yf2100 2008-08-26
  • 打赏
  • 举报
回复
[Quote=引用 29 楼 unsigned 的回复:]
以前讨论VirtualAlloc的贴子:
http://topic.csdn.net/u/20080128/09/c2678506-4193-4bfe-aaef-1c2b30520245.html
[/Quote]
嗯,看了很有收获,已经mark了

好在我这里的内存分配申请不是很频繁,不用担心碎片和核心内存耗尽的问题:)
僵哥 2008-08-26
  • 打赏
  • 举报
回复
yf2100 2008-08-24
  • 打赏
  • 举报
回复
[Quote=引用 25 楼 unsigned 的回复:]
Windows各内存分配接口的差别:http://msdn.microsoft.com/en-us/library/aa366533(VS.85).aspx
[/Quote]en,这个有用,受教了~谢谢~继续学习中....

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

欢迎各位大侠继续指教!
僵哥 2008-08-23
  • 打赏
  • 举报
回复
僵哥 2008-08-23
  • 打赏
  • 举报
回复
关于Windows各版本的内存限制,可以参看下面页面的表格:
Memory Limits for Windows Releases
僵哥 2008-08-23
  • 打赏
  • 举报
回复
[Quote=引用 21 楼 yf2100 的回复:]
感谢楼上的兄弟

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

omg,BDS2007的内存管理太烂了!
[/Quote]
如果你怀疑是RTL的问题,那试一下HeapAlloc,这个是Windows API跟C的RTL没有任何直接关系.
yf2100 2008-08-23
  • 打赏
  • 举报
回复
突然发现自己有三条裤衩了:p
yf2100 2008-08-23
  • 打赏
  • 举报
回复
感谢楼上的兄弟

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

omg,BDS2007的内存管理太烂了!
Behard 2008-08-03
  • 打赏
  • 举报
回复
没有具体研究过,不过几种编译器是不一样的
我的电脑:XP SP2 物理3G内存,显示为 2.75G
BCB 5 malloc 能分配 1435M, BDS2007 能分配 720M
VC6 能分配 700 多M, VS 2005 没有测试
Alan_Pisces 2008-08-02
  • 打赏
  • 举报
回复
这个进程内存应该和电脑内存没有多大的关联吧。
再说你那个是一次分配,没有这么大的连续的空间而已。
你可以在程序一开始就分配,这样成功概率大一点。
不然就分多次分配,然后用一个结构管理一下,这个管理结构用类封装一下,正常的操作在里面用接口重新实现一下,在类外面使用上也感觉不出来,也应该不会影响你的使用的。
jacknes009 2008-08-02
  • 打赏
  • 举报
回复
LZ有结果了嘛???
  • 打赏
  • 举报
回复
你看一下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用户方式分区中正确地运行,否则它们的行为特性是无法确定的
yf2100 2008-08-02
  • 打赏
  • 举报
回复
[Quote=引用 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;
}
[/Quote]
VirtualAlloc是不是把虚拟内存也用上了?这样的话好像保证不了速度啊
yf2100 2008-08-02
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 cczlp 的回复:]
32位程序上,理论上 <4G.
另外,你说的“高速”是什么概念,内存这麽大,都是分配到硬盘上,不可能很快, 还是改进算法吧
[/Quote]牛人进来先拜一下:)

...内存绝对要这么大的,用途比较特殊,要求速度越快越好的场合,不便细说,仔细考虑了,算法优化我也想过,可能多缓冲区的做法能行,但我真的不想这么做:(
  • 打赏
  • 举报
回复
在我机器上运行成功,
我机器1G内存。

#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;
}

加载更多回复(11)

13,825

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧