c++ - 我可以进一步减少这个小型 MSVC++ 项目的 "private bytes"内存使用吗?

标签 c++ windows visual-c++

我问这个问题是出于好奇而不是真正的需要,但是这个微型 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/

相关文章:

c++ - 包含 C++ 文件时 Visual Studio 2013 崩溃

c++ - 继承 : Access both private and public parts of another class

C sha1 实现不适用于 Unix

c++ - wxWidgets 对话框布局与 Gridbagsizer

c++ - 如何在文件打开对话框中隐藏特定控件? (使用 CFileDialog 创建的对话框)

c++ - 在 C++ 中求值是什么意思?

c++ - 如何返回包含字符串/整数变量的字符串

php - 在 Windows 上将 Unicode 字符串传递给 PHP shell_exec

windows - 重新运行时将 Unicode 参数传递给 Windows .bat 文件

visual-c++ - 如何在 Visual C++ 中将一些函数分组到 .exe 输出的新内存部分