C++中开辟大内存
答案:6 悬赏:70 手机版
解决时间 2021-04-06 04:30
- 提问者网友:蓝琪梦莎
- 2021-04-05 21:38
C++中开辟大内存
最佳答案
- 五星知识达人网友:掌灯师
- 2021-04-05 21:43
NodeInfoBlock *p,*q; //创建空闲数据块链表的操作指针
//分配大内存块
char *pNodeInfoBlock=(char *)malloc(sizeof(NodeInfoBlock)*BlockCount);
//指向空闲内存块
MPoll->pNodeInfoFree=(NodeInfoBlock *)pNodeInfoBlock;
//将分配好的大内存块,按照具体的结构切割为小块,并形成空闲数据块链表
p=(NodeInfoBlock *)MPoll->pNodeInfoFree;
for (i=1;i {
q=((NodeInfoBlock *)MPoll->pNodeInfoFree+i);
p->next=q;
p=q;
}
q->next=NULL;
说明:
不管申请多大的内存,在物理内存分布上可能是不连续的,但对用户程序而言,虚拟地址一定都是连续的,连虚拟地址空间上都没有足够大的连续空间的话,分配就会失败。
//分配大内存块
char *pNodeInfoBlock=(char *)malloc(sizeof(NodeInfoBlock)*BlockCount);
//指向空闲内存块
MPoll->pNodeInfoFree=(NodeInfoBlock *)pNodeInfoBlock;
//将分配好的大内存块,按照具体的结构切割为小块,并形成空闲数据块链表
p=(NodeInfoBlock *)MPoll->pNodeInfoFree;
for (i=1;i
q=((NodeInfoBlock *)MPoll->pNodeInfoFree+i);
p->next=q;
p=q;
}
q->next=NULL;
说明:
不管申请多大的内存,在物理内存分布上可能是不连续的,但对用户程序而言,虚拟地址一定都是连续的,连虚拟地址空间上都没有足够大的连续空间的话,分配就会失败。
全部回答
- 1楼网友:骨子里都是戏
- 2021-04-06 02:23
不明巨额里。追问????追答你的操作系统是几位的?不会是32位的吧??照理说,你的是16G内存,如果是64位,应该不会有这个限制才对。追问操作系统是 64位的,编译器也是用的X64啊......追答
我用vs2008 64位编译器,byte * long3g=new byte[3,000,000,000];,没有问题啊。。。。
8G也没问题啊,不信你看下图:
追问我用的是vs2010, 用new运算符开辟3G是可以的,但是3G以上就直接编译不过了....在网上找,别人说是在编译的时候vs用了 mixed compiler,不是用的native compiler,所以是这样....然后我用malloc是可以随便开辟内存的(当然是小于机子的配置啦).....
不管怎样....
谢谢你啦.....
我用vs2008 64位编译器,byte * long3g=new byte[3,000,000,000];,没有问题啊。。。。
8G也没问题啊,不信你看下图:
追问我用的是vs2010, 用new运算符开辟3G是可以的,但是3G以上就直接编译不过了....在网上找,别人说是在编译的时候vs用了 mixed compiler,不是用的native compiler,所以是这样....然后我用malloc是可以随便开辟内存的(当然是小于机子的配置啦).....
不管怎样....
谢谢你啦.....
- 2楼网友:玩家
- 2021-04-06 01:14
malloc(1024*1024*1024*8)追问试过了,开辟不了啊......追答返回指针为空咯?!可能是有内存保护吧。。。追问是滴啊.......
所以要怎么搞才能开到至少3G的内存呢......追答这个真没有试过呢,不好意思呢,没什么参考建议。。。
另外VirtualAlloc的话,第三个参数需要注意,第一次开辟的时候,必须是MEM_COMMIT | MEM_RESERVE两个类型(API的阐述中有提及),否则不会分配成功。追问嗯嗯,谢谢啦....
所以要怎么搞才能开到至少3G的内存呢......追答这个真没有试过呢,不好意思呢,没什么参考建议。。。
另外VirtualAlloc的话,第三个参数需要注意,第一次开辟的时候,必须是MEM_COMMIT | MEM_RESERVE两个类型(API的阐述中有提及),否则不会分配成功。追问嗯嗯,谢谢啦....
- 3楼网友:怀裏藏嬌
- 2021-04-05 23:42
c++和c的区别在哪啊?追问开辟内存的方法,c++多了new.....
- 4楼网友:酒醒三更
- 2021-04-05 22:13
的确直接用new就行
你试试
char *a = new char[1024ULL * 1024ULL * 1024ULL * 8ULL];
注意后面要带ULL代表无符号超长整型数值,否则会默认int导致溢出或符号问题追问谢谢老兄了啦.....
真的这样子就可以了....
不过也最多能申请3G,不然VS直接报错了.....
你试试
char *a = new char[1024ULL * 1024ULL * 1024ULL * 8ULL];
注意后面要带ULL代表无符号超长整型数值,否则会默认int导致溢出或符号问题追问谢谢老兄了啦.....
真的这样子就可以了....
不过也最多能申请3G,不然VS直接报错了.....
我要举报
如以上问答信息为低俗、色情、不良、暴力、侵权、涉及违法等信息,可以点下面链接进行举报!
大家都在看
推荐资讯