我可以进一步减少这个微小的MSVC ++项目的“私有字节”内存使用量吗?

时间:2012-01-13 17:41:03

标签: c++ windows visual-c++

我出于好奇而不是真正的需要而问这个问题,但是这个微小的MSVC ++程序的内存使用能否进一步降低? BitBucket上的Source file

程序编译时使用“优化代码大小”。它会创建一个仅限消息的窗口并设置一个键盘钩子,显示一个托盘图标以响应按下Caps / Num / Scroll 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和/或标准操作系统代码。

这可能会减少吗?这看起来像是储蓄的主要候选人。

Page Table

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

堆叠和私人数据

嗯,那些已经非常小了......虽然我确实想知道它们为什么不是更小。我认为该程序没有任何接近那么多的私人数据或堆栈。

您能否建议如何使这些部分比现有部分更小?


进一步的调查结果:

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

所以看起来这个内存大部分是由Windows API消耗的,这似乎排除了显着的进一步减少,除非有人能想出一种方法来使钩子/托盘图标工作而不创建一个窗口(这个程序已经忽略了所有消息无论如何)。

4 个答案:

答案 0 :(得分:3)

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

通常不值得,除非您已经尽量少使用该语言的运行时库。它还使您的应用程序更不便携。

答案 1 :(得分:2)

"流程环境块"包含所有环境变量的副本。

如果您没有继承任何环境(即父进程在干净的环境中产生了您),那么相对于您现在正在查看的总内存使用量,这可能会产生明显的下降。

答案 2 :(得分:0)

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

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

答案 3 :(得分:0)

this answer开始,私有字节是显式提交或标记为MEM_PRIVATE或已写入的可执行页面的内存量度。因此,如果您动态分配存储而不是使用全局变量(包括函数本地静态),您应该能够减少专用字节的使用,尽管可能会增加整体堆的使用量。