64位下new不能也超过2gb?

WJN92 2017-07-24 04:37:37
32位下,我知道不能超过2gb
但是我使用的是64位编译,为什么也不能超过2gb呢?
...全文
368 17 打赏 收藏 转发到动态 举报
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
赵4老师 2017-07-31
  • 打赏
  • 举报
回复
引用 16 楼 zhao4zhong1 的回复:
[quote=引用 5 楼 wfy1008 的回复:] 使用VirtualAllocEx吧,毫无压力,我们经常申请16GB
VirtualAllocEx能申请的最大内存也有限制。[/quote] 但2楼的办法可使用的最大容量肯定比VirtualAllocEx能申请的最大内存大。
赵4老师 2017-07-31
  • 打赏
  • 举报
回复
引用 5 楼 wfy1008 的回复:
使用VirtualAllocEx吧,毫无压力,我们经常申请16GB
VirtualAllocEx能申请的最大内存也有限制。
真相重于对错 2017-07-31
  • 打赏
  • 举报
回复
虚拟地址到物理地址的翻译是以内存块为单位的 也就是说,我在程序中new 了一个指针,这个指针所指向的内存地址,无论是在虚拟内存中,还是在物理内存中,都是连续的, 你还是好好把intel的说明看看吧
WJN92 2017-07-31
  • 打赏
  • 举报
回复
引用 13 楼 hdt 的回复:
如果真的允许一个指针指向的内存断续现象的存在,必然引起,每次读写(不管是由系统底层负责,还是api)都要去判断是否越界,必然会造成性能的极大消耗。 不知道你怎么得出的如此奇葩的想法?
我说的是物理地址可以不连续。虚拟地址当然是连续的啦 物理地址翻译成虚拟地址由CPU上面的MMU(Memory Management Unit)负责的。 32位windows的页表地址为 C0000000 开始。也就是为什么空指针会出现 C0000000 错误的原因。 因为C0000000 表示的就是 nullptr指针 的虚拟地址 详情请看intel手册吧
真相重于对错 2017-07-30
  • 打赏
  • 举报
回复
如果真的允许一个指针指向的内存断续现象的存在,必然引起,每次读写(不管是由系统底层负责,还是api)都要去判断是否越界,必然会造成性能的极大消耗。 不知道你怎么得出的如此奇葩的想法?
真相重于对错 2017-07-30
  • 打赏
  • 举报
回复
引用 10 楼 WJN92 的回复:
[quote=引用 9 楼 hdt 的回复:] [quote=引用 7 楼 WJN92 的回复:] [quote=引用 6 楼 hurryboylqs 的回复:] 关键看你有没有2GB的连续内存,
windows的内存管理都是分页的啊。物理地址不一定要连续呀。 [/quote]难道 int* a = (int*)malloc(sizeof(int)*1024) a 指向的内存可以断断续续???? 想想 a+1 a+2 a+512,怎么实现? [/quote] 这个是物理地址和虚拟地址的分别。你想想为什么每个进程都可以拥有自己独立的内存空间和地址。[/quote] 你想的太多了
WJN92 2017-07-30
  • 打赏
  • 举报
回复
引用 8 楼 CharlesSimonyi 的回复:
我这里测试new申请10个G没有问题
刚刚我也测试了一下,发现release里面分配不到,但是在debug下面却分配成功了!? 郁闷了
WJN92 2017-07-30
  • 打赏
  • 举报
回复
引用 9 楼 hdt 的回复:
[quote=引用 7 楼 WJN92 的回复:] [quote=引用 6 楼 hurryboylqs 的回复:] 关键看你有没有2GB的连续内存,
windows的内存管理都是分页的啊。物理地址不一定要连续呀。 [/quote]难道 int* a = (int*)malloc(sizeof(int)*1024) a 指向的内存可以断断续续???? 想想 a+1 a+2 a+512,怎么实现? [/quote] 这个是物理地址和虚拟地址的分别。你想想为什么每个进程都可以拥有自己独立的内存空间和地址。
真相重于对错 2017-07-29
  • 打赏
  • 举报
回复
引用 7 楼 WJN92 的回复:
[quote=引用 6 楼 hurryboylqs 的回复:] 关键看你有没有2GB的连续内存,
windows的内存管理都是分页的啊。物理地址不一定要连续呀。 [/quote]难道 int* a = (int*)malloc(sizeof(int)*1024) a 指向的内存可以断断续续???? 想想 a+1 a+2 a+512,怎么实现?
encoderlee 版主 2017-07-29
  • 打赏
  • 举报
回复


我这里测试new申请10个G没有问题
WJN92 2017-07-29
  • 打赏
  • 举报
回复
引用 6 楼 hurryboylqs 的回复:
关键看你有没有2GB的连续内存,
windows的内存管理都是分页的啊。物理地址不一定要连续呀。
hurryboylqs 2017-07-28
  • 打赏
  • 举报
回复
关键看你有没有2GB的连续内存,
wfy1008 2017-07-28
  • 打赏
  • 举报
回复
使用VirtualAllocEx吧,毫无压力,我们经常申请16GB
赵4老师 2017-07-27
  • 打赏
  • 举报
回复
在现实世界中,除时间和空间可能是无限的以外,其它任何事物都是有限的。
  • 打赏
  • 举报
回复
为什么要new2GB这么大的内存呢?如用到这么大的内存为何不换种方式?
赵4老师 2017-07-24
  • 打赏
  • 举报
回复
容量大小从小到大:栈≤全局数据≤堆≤文件≤硬盘≤磁盘阵列≤云存储 当程序需要使用比如2GB~1TB左右的存储时,最简单的办法恐怕得是用文件读写模拟内存读写了吧。windows参考_fseeki64函数,linux参考fseeko64函数。
FILE *fA;fA=fopen("A","rb+");_fseeki64(fA,10000000000i64*sizeof(int),SEEK_SET);fputc(fA,0);//int A[10000000000];
int B;
_fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fread(&B,1,sizeof(int),fA);//B=A[9999999999];
_fseeki64(fA,9999999999i64*sizeof(int),SEEK_SET);fwrite(&B,1,sizeof(int),fA);//A[9999999999]=B;
fclose(fA);
WJN92 2017-07-24
  • 打赏
  • 举报
回复
修改了一下代码 发现 new 1gb 也不行。 是不是要使用系统的api分配呢?

16,473

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

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