我问这个问题是出于好奇而不是真正的需要,但是这个微型 MSVC++ 程序的内存使用量可以进一步减少吗? Source file在 BitBucket 上。
该程序是使用“优化代码大小”编译的。它创建一个仅显示消息的窗口并设置一个键盘 Hook ,显示托盘图标以响应 Caps/Num/Scroll Lock 键按下。
根据VMMap,私有(private)字节分配如下:
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 和/或标准操作系统代码。
这可能会减少吗?这看起来是节省开支的主要候选者。
页表
该程序的总虚拟大小为 44 MB,约 11k 页。平均每页 22 个字节(尽管可能有一堆条目未使用)。所以这可能不能再减少了。或者可以吗?
堆栈和私有(private)数据
好吧,它们已经小得离谱了……不过我确实想知道为什么它们没有变得更小。我认为该程序没有那么多私有(private)数据或堆栈。
您能否建议使这些部分中的任何部分比现有部分更小的方法?
进一步的发现:
- 一个空白的非 CRT 程序使用大约 204 KB
- 调用
CreateWindow
增加 420 KB - 设置键盘钩子(Hook)的调用增加了 156 KB
- 避免使用 CRT 可节省 20 KB
- 总虚拟大小以类似的方式增加
- 不使用 CRT 可大大节省 EXE 大小:从 54 KB 减少到 18 KB,其中 12 KB 是资源。
所以看起来大部分内存都被 Windows API 消耗了,这似乎排除了进一步显着减少的可能性,除非有人能想出一种方法让 Hook /托盘图标在不创建窗口的情况下工作(这个程序已经忽略了所有消息)。
最佳答案
依靠操作系统提供的 API(在您已经映射到您的进程中的 DLL 中)或您自己实现它们,完全省略 C 运行时库是可能的。
这通常是不值得的,除非您已经很少使用该语言的运行时库。它还会降低您的应用程序的可移植性。
关于c++ - 我可以进一步减少这个小型 MSVC++ 项目的 "private bytes"内存使用吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8854833/