16位字节对齐大内存申请问题

whxp2010 2012-07-18 09:34:32
32位系统用_aligned_malloc申请800M左右内存就失败,如何安全地申请到2G内存?

void *c=_aligned_malloc(1024*1024*800,16);
...全文
429 23 打赏 收藏 转发到动态 举报
写回复
用AI写文章
23 条回复
切换为时间正序
请发表友善的回复…
发表回复
whxp2010 2012-07-23
  • 打赏
  • 举报
回复
[Quote=引用 22 楼 的回复:]

不要超乎想当然,看自己的内存有多大吧
[/Quote]

实践出真知,请试过再发表您的高论。
whxp2010 2012-07-20
  • 打赏
  • 举报
回复
[Quote=引用 18 楼 的回复:]

如果要用那么大内存,请使用64位操作系统并且物理地址需要足够大,不然就算这次申请成功了,下次也不见得成功
[/Quote]
楼上说的貌似不对,我用我发的那个代码同时运行三个,硬盘猛闪,但也申请成功了,说明windows下给进程2G内存是确定的。
wshn13 2012-07-20
  • 打赏
  • 举报
回复
linux下一般可以申请到2.9G左右 win下差不多1.5G
sl51314240 2012-07-20
  • 打赏
  • 举报
回复
如果要用那么大内存,请使用64位操作系统并且物理地址需要足够大,不然就算这次申请成功了,下次也不见得成功
whxp2010 2012-07-20
  • 打赏
  • 举报
回复
另外补充一下,在正式程序中当我申请到整块800M(在往上申请就失败)内存后,再尝试另外申请时居然又申请到300M的内存,怀疑是不是_aligned_malloc只能返回连续的内存地址,只能申请到800M的整块内存的原因是不是因为“内存碎片”的缘故呢?,如果是的话,能不能在程序中整理呢?请高手指教
whxp2010 2012-07-20
  • 打赏
  • 举报
回复
表示不懂什么是用户空间模式,请楼上稍微解释一下。
我并没有做特殊处理,以下是我的测试代码:参数argv[1]的最大值可以设到1900,就是说可以申请到1.9G的内存。
#include "stdio.h"
#include "stdlib.h"
#include "string.h"
void *cacheaa;
int main(int argc, char* argv[])
{
int len=1024*1024*atol(argv[1]);
cacheaa=_aligned_malloc(len,16);
printf("%d,%s\n",len,cacheaa?"ok":"fail");
if(cacheaa)memset(cacheaa,0,len);
system("pause");
return 0;
}
寂寞vs爱神 2012-07-20
  • 打赏
  • 举报
回复
不要超乎想当然,看自己的内存有多大吧
赵4老师 2012-07-20
  • 打赏
  • 举报
回复
用文件读写模拟内存读写,空间大小只受硬盘剩余空间限制。
参考_lseeki64函数。
luciferisnotsatan 2012-07-19
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 的回复:]

是32位Win2003 Server。

我自己也写过测试代码,可以一次性申请到1.9G的内存的,但是在正式的程序中就只能申请到800左右,注意是初始化阶段,没有其他任何干扰。我想知道的是1G内存跑那去了,有什么东西占用了那么多的内存?查看任务管理器发现程序也就占用了40M内存,感觉任务管理器没把所有内存查出来。
[/Quote]
1.9G那个,是不是用了3G用户空间模式?
luciferisnotsatan 2012-07-19
  • 打赏
  • 举报
回复
2G用户空间模式的话,之前测了下,最多只能申请到1.4G左右连续内存。
AnYidan 2012-07-19
  • 打赏
  • 举报
回复
[Quote=引用 8 楼 的回复:]

32位xp下每个进程有4G内存空间,通常高2G为系统空间,用户空间为低2G,普通程序一般申请大约2G内存是没问题的,但一次最好别申请太大。C/C++ code
#include<stdio.h>
#include<stdlib.h>
int main() {
void *p;
static int a=0;
while (1) {
p=malloc(10……
[/Quote]

++
hotpos 2012-07-18
  • 打赏
  • 举报
回复
楼上纯属扯

你自己代码不占内存么
赵4老师 2012-07-18
  • 打赏
  • 举报
回复
如果硬盘剩余空间够的话,你可以安全地申请到连续的2GB临时文件。
whxp2010 2012-07-18
  • 打赏
  • 举报
回复
自己写了个小测试,最大申请到1.9G内存的,而正式程序启动时也是第一时间申请,但一般到800M就返回0地址了,用什么方法可以检测剩余的1G内存在哪里被占用了,那么大块内存不会无缘无故就不能用了吧。
W170532934 2012-07-18
  • 打赏
  • 举报
回复
在虚拟机下申请估计够呛啊
whxp2010 2012-07-18
  • 打赏
  • 举报
回复
虚拟机,给了8G内存,应该没问题啊
图灵狗 2012-07-18
  • 打赏
  • 举报
回复
空余的内存不够吧。
wshn13 2012-07-18
  • 打赏
  • 举报
回复
关键你物理内存多大?
机智的呆呆 2012-07-18
  • 打赏
  • 举报
回复
vc好像只能申请2g的内存
whxp2010 2012-07-18
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 的回复:]

任务管理器中看虚拟内存。
[/Quote]

楼上能说清楚些吗?
加载更多回复(3)

69,382

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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