有个程序,需要处理一张16384x16384大小的图片,需要把整个图片读入内存,常规处理了半天总是内存报错,起初怀疑GDI的问题,后来发现是内存申请问题。很奇怪,32位程序也应该有2G的用户内存啊,怎么new不出来1G内存?
无聊,写了个测试内存申请程序如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 | int M = 1024*1024; char * p; for ( int i=0; i<INT_MAX; ++i){ try { p = new char [i * M]; if (p){ delete []p; } catch (...){ print( "bad alloc" , i); break ; } } } |
本人一直使用,c++buider 2010,测试工程是vcl界面工程,发现最大可申请内存是691M,又测试了其他内存管理函数SysAllocMem、GlobalAlloc,发现申请的内存都超不过700M。后来和c++一些群里面的人讨论,有个观点是,可能程序调用的模块,占用了地址,导致没有那么长的连续内存。
上面的代码我又用gcc测试了一下,代码如下:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 | #include <stdio.h> #include <stdlib.h> int main() { int M = 1024 * 1024; char *p; for ( int i=0; i<2048; ++i){ try { p = new char [i * M]; delete []p; } catch (...){ printf ( "bad alloc %i\n" , i); break ; } } system ( "pause" ); } |
结果发现,gcc编译的程序,可以申请1G以上内存,那vcl界面工程申请不出来的原因是什么呢?后来想到,如果是程序的一些模块占用的地址空间,导致没有连续内存的话,那么整理一下模块会不会好点?c++builder有个静态编译模式(不依赖链接库和bpk库),于是修改工程属性,测试了一下,果然。虽然结果记得1300多,没有纯dos程序多,但够了。
于是这个大图片就能顺利显示出来了,配合自己写的缩放程序,自我感觉很良好:
sdragonx https://github.com/sdragonx
分类:
c++
, C++Builder
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 零经验选手,Compose 一天开发一款小游戏!
· 通过 API 将Deepseek响应流式内容输出到前端
· AI Agent开发,如何调用三方的API Function,是通过提示词来发起调用的吗