是否可以进一步减少此小型 MSVC++ 项目的内存使用量"private bytes"?



我问这个问题是出于好奇,而不是真正的需要,但这个微小的MSVC++程序的内存使用量能进一步减少吗?BitBucket上的源文件。

该程序是用"优化代码大小"编译的。它创建了一个仅显示消息的窗口,并设置了一个键盘挂钩,在按下Caps/Num/Soll Lock键时显示一个任务栏图标。

根据VMMap,专用字节分配如下:

260 KB: Image
252 KB: Heap
240 KB: Page Table
 24 KB: Stack
 24 KB: Private Data
------
800 KB  TOTAL

图像

应用程序本身只使用其中的20 KB;其余部分由十几个DLL消耗。看起来这个已经很小了。

该程序只在堆上分配大约3 KB的数据:正好是某个类的三个实例。其余部分必须来自CRT和/或标准操作系统代码。

这也许可以减少吗?这看起来是节省开支的最佳选择。

页面表

该程序的总虚拟大小为44MB,约为11k页。平均每页22个字节(尽管可能有一堆条目未使用)。因此,这可能无法进一步减少。还是可以?

堆栈和私有数据

嗯,这些已经小得离谱了。。。尽管我很想知道为什么它们不更小。我认为这个程序没有那么多的私有数据或堆栈。

你能建议一些方法让这些部分比现在更小吗?


进一步发现:

  • 一个空白的无CRT程序使用大约204KB
  • CreateWindow的调用增加了420 KB
  • 调用设置键盘挂钩增加了156 KB
  • 避免使用CRT可节省20 KB
  • 总虚拟大小以类似的方式增加
  • 不使用CRT可以节省相当多的EXE大小:从54KB减少到18KB,其中12个是资源

因此,看起来大部分内存都被Windows API消耗掉了,这似乎排除了显著的进一步减少,除非你能找到一种方法,使挂钩/托盘图标在不创建窗口的情况下工作(无论如何,这个程序已经忽略了所有消息)。

通过依赖操作系统提供的API(这些API位于您已经映射到流程中的DLL中)或自己实现它们,可以完全省略C运行库。

这通常是不值得的,除非您已经尽可能少地使用该语言的运行库。它还降低了应用程序的可移植性。

"Process Environment Block"包含所有环境变量的副本。

如果您没有继承任何环境(即父进程为您生成了一个干净的环境),那么相对于您现在所看到的总内存使用量,这可能会显著减少。

根据这个答案,私有字节是明确提交或标记为MEM_PRIVATE或已写入的可执行页面的内存的度量。因此,如果您动态分配存储,而不是使用全局变量(包括函数本地静态),您应该能够减少私有字节的使用量,尽管您可能会增加总体堆的使用量。

您可以使用"pragma pack(1)"来确保在成员的内存空间之间不会分配额外的空间。

http://msdn.microsoft.com/en-us/library/2e70t5y1%28v=vs.80%29.aspx

最新更新