1 查询当前可用的内存
MEMORYSTATUS m;
m.dwLength = sizeof(m);
::GlobalMemoryStatus(&m);
m.dwAvailVirtual记录了当前进程可用的内存,单位是字节!!
2 DLL占用内存
WinCE5.0系统上说明每一个进程可以占用32MB的内存,实际上可能更少,或许只有25MB的内存空间,目前实测如此。但是对于大型的程序,DLL可能本身的文件体积都有10MB多,这种情况下,如果系统提供了25MB的内存,剔除10MB的DLL占用空间,用户还剩下的空间就只有15MB。
3 优化方案
1)DLL按照体积从小到大进行加载
DLL加载有一个64KB边界问题
2)优化编译体积
意义不大
3)指定线程的堆栈大小
::CreateThread((LPSECURITY_ATTRIBUTES)NULL, 20*1024,
(LPTHREAD_START_ROUTINE)WatchCommPort,
(LPVOID)this,
STACK_SIZE_PARAM_IS_A_RESERVATION, &threadID)
默认情况下会分配1MB的内存给线程堆栈,现在默认给定20KB,同时指定函数的倒数第二个参数为该
STACK_SIZE_PARAM_IS_A_RESERVATION宏定义。
4)使用文件映射的方式
只适用于malloc,对于new,只能够重构代码
注意事项
软件运行的时间越长,运行的速度就越慢,慢的原因有内存分配的效率越来越低,程序的内存区域存在大量的碎片,需要进行长时间的遍历才能够分配到一块合适的内存区域在需要频繁进行内存分配的地方,只是分配内存一次,然后通过静态变量的方法保存分配的内存指针